【PHP】array_valuesで配列の値を取得・キーを振り直す|JSON配列化の必須テク

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の後にキーが飛び飛びになります。
Aarray_filter()キーを保持する仕様だからです。array_values() を通すと 0,1,2… の連番に振り直せます。unset() で要素を削除した場合も同様です。
Qjson_encodeで配列が{}(オブジェクト)になってしまいます。
Aキーが 0 から連番でない(歯抜け・文字列キー)と、json_encodeはオブジェクトとして出力します。配列 [] として出力したい場合は、array_values() でキーを振り直してから json_encode してください。
Qarray_valuesとarray_keysの違いは?
Aarray_values()だけを、array_keys()キーだけを取り出します。用途に応じて使い分けます。

まとめ

PHPのarray_valuesのポイントを整理します。

  • array_values() は値だけを取り出しキーを0から振り直す
  • 元の配列は変更しない(新しい配列を返す)
  • array_filter() / unset() 後の歯抜けキーを連番に戻すのが定番
  • json_encodeで配列 [] として出力したいときに必須
  • キー側を取りたいときは array_keys()

関連として、配列のキーを取得する方法配列の最初と最後の要素を取得する方法配列の要素数をカウントする方法もあわせて読むと、PHPの配列操作に強くなれます。