array_values() は配列から値だけを取り出し、キーを0から振り直した新しい配列を返します。単に値を抜き出すだけでなく、array_filter() や unset() で歯抜けになったキーを連番に戻す用途で特によく使われます。これを知らないと、JSON出力が意図せずオブジェクトになってハマります。この記事では基本から、その実用テクニックまで解説します。
この記事の結論:
array_values($arr) は値だけを取り出し、キーを 0,1,2… に振り直します。元の配列は変更しません。array_filter() 後などキーが歯抜けの配列をJSONで配列として出力したいときに必須です。array_values()の基本的な使い方
連想配列に使うと、キー(name・age・city)は捨てられ、値だけが0始まりのインデックスで返ります。
値だけを取り出す
<?php
$array = [
"name" => "John",
"age" => 30,
"city" => "New York",
];
$values = array_values($array);
print_r($values);
// Array ( [0] => John [1] => 30 [2] => New York )
キーが数値・文字列で入り混じっていても、すべて0からの連番に振り直されます。
array_filterやunsetで歯抜けになったキーを直す
array_values() が最も活躍するのがこの場面です。array_filter() や unset() はキーをそのまま残すため、結果のキーが 0, 2, 4… のように歯抜けになります。array_values() で連番に振り直せます。
array_filter後のキーを連番に
<?php $nums = [10, 20, 30, 40, 50]; $filtered = array_filter($nums, fn($v) => $v >= 30); print_r($filtered); // Array ( [2] => 30 [3] => 40 [4] => 50 ) ← キーが歯抜け $reindexed = array_values($filtered); print_r($reindexed); // Array ( [0] => 30 [1] => 40 [2] => 50 ) ← 0から連番に
JSON出力での注意(配列になるかオブジェクトになるか)
これは実務で非常によくハマるポイントです。json_encode() は、キーが 0,1,2… の連番ならJSON配列 []、そうでなければJSONオブジェクト {} として出力します。array_filter() 後の歯抜け配列をそのまま渡すと、配列のつもりがオブジェクトになってしまいます。
array_valuesでJSON配列にする
<?php
$nums = [10, 20, 30, 40, 50];
$filtered = array_filter($nums, fn($v) => $v >= 30); // キー 2,3,4
echo json_encode($filtered);
// {"2":30,"3":40,"4":50} ← オブジェクトになってしまう
echo json_encode(array_values($filtered));
// [30,40,50] ← array_values で正しく配列になる
APIのレスポンスでは要注意です。フロント側が「配列」を期待しているのに、
array_filter() 後の配列をそのまま json_encode() するとオブジェクトで返り、フロントの処理が壊れることがあります。配列として返したいときはarray_values() を通してから出力しましょう。JSONの扱い全般はJSONを利用する方法、値ではなくキー側を取り出したいときは配列のキーを取得する方法(array_keys)が参考になります。
よくある質問(FAQ)
Qarray_values()は元の配列を変更しますか?
Aいいえ。新しい配列を返すだけで、元の配列は変更されません。結果を別の変数で受け取って使います。
Qarray_filterの後にキーが飛び飛びになります。
A
array_filter() はキーを保持する仕様だからです。array_values() を通すと 0,1,2… の連番に振り直せます。unset() で要素を削除した場合も同様です。Qjson_encodeで配列が{}(オブジェクト)になってしまいます。
Aキーが
0 から連番でない(歯抜け・文字列キー)と、json_encodeはオブジェクトとして出力します。配列 [] として出力したい場合は、array_values() でキーを振り直してから json_encode してください。Qarray_valuesとarray_keysの違いは?
A
array_values() は値だけを、array_keys() はキーだけを取り出します。用途に応じて使い分けます。まとめ
PHPのarray_valuesのポイントを整理します。
array_values()は値だけを取り出しキーを0から振り直す- 元の配列は変更しない(新しい配列を返す)
array_filter()/unset()後の歯抜けキーを連番に戻すのが定番- json_encodeで配列
[]として出力したいときに必須 - キー側を取りたいときは
array_keys()
関連として、配列のキーを取得する方法・配列の最初と最後の要素を取得する方法・配列の要素数をカウントする方法もあわせて読むと、PHPの配列操作に強くなれます。
