PHPで連想配列を扱うとき、キー(key)があることで使い勝手が良くなる場合が多いですが、逆にキーを無視して“値だけ”を取り出したいことがしばしばあります。そんなときに役立つのがarray_values関数です。キーを捨てて値のみを再構築する使い方や注意点、パフォーマンス、代替手段まで、実際のコード例とともに詳しく解説します。
目次
array_values 連想 配列 の基本とは何か
PHPでは配列がキーと値のペアを持つ連想配列として扱われるため、特定のデータ構造を操作するときに値だけを取り出したい場面があります。array_valuesはまさにそのための組み込み関数であり、入力された配列からすべての値を抽出し、数値キーでゼロ始まりに再インデックスされた新しい配列を返します。
連想配列とは何かを抑えることで、array_valuesが何をしてくれるかがより明確になります。連想配列ではキーが文字列であったり非連続の整数だったりしますが、関数を用いることでそれらのキーを一切保たず値だけを取得できます。
連想配列とは何か
連想配列は、要素を名前(文字列)や特定の整数キーでアクセスできる配列です。順序は保持されますが、キーの型や値との対応が重要です。例えば「name」=>「Alice」、「age」=>25のように、識別子としてのキーがあり、それに対応する値があります。他にも混在する型のキーや非連続の整数キーが含まれるケースも普通にあります。
このような配列は、人間にとって意味を持つデータ構造(ユーザー情報、設定値、辞書的データ)などで非常に便利です。しかし、キー情報が不要な場合には逆に扱いにくくなることもあります。
array_values関数の動作
array_valuesは入力配列から値のみを抽出し、数値インデックス(0,1,2,・・・)で再割当てされた配列を返します。元のキーはすべて捨てられます。連想配列でも、混在キーの配列でも、文字列キーや整数キーを含むすべての要素の値が対象になります。
具体的には、引数に配列を渡すと中の値をそのまま保持し、順序を変えることなく新しい数値キーの配列に構成し直されます。元の配列そのものは変更されません。配列の順序が重要な場合にも安全に使えます。
array_valuesを使う場面
値だけが必要な場面としては以下のようなケースがあります。
- ビューやテンプレートで連想配列のキーは使わず、値だけをリスト表示するとき
- 配列をJSONエンコードして値のみのリストで返したいAPI設計のとき
- 非連続または文字列キーがある配列をfilterやmap処理で値リストとして扱いたいとき
- 配列のインデックスを0始まりにリセットしたいとき(unset操作後など)
たとえばfilterによって要素を除いた後、キーが飛んでしまった状態をリセットするためにarray_valuesを組み合わせることが一般的に行われています。
array_values 連想 配列 具体的な使い方と例
実際のコード例を見ながら、array_valuesを使って連想配列から値だけを取り出す方法を確認します。複数のパターンでどう動くかを比較することで、どのようなケースで使うべきかが明確になります。
基本的な使用例
たとえば以下のような連想配列があるとします。
そしてarray_valuesを使って値だけを取得するコード例を示します。
<?php
$data = [ "name" => "Alice", "age" => 30, "city" => "Tokyo" ];
$values = array_values($data);
print_r($values);
?>
出力は以下のようになり、キーが捨てられ値のみが数値インデックスで並びます。
Array([0] => Alice [1] => 30 [2] => Tokyo)
このように、連想配列のキーを意識せずに値だけを扱いたいときに非常にシンプルで効率的な方法です。
unsetとの組み合わせでキーをリセットする
配列から特定の要素をunsetで削除すると、キーが抜けたまま残ることがあります。たとえばキー0,2,3のように1が抜けた連続性のない状態になります。こうした場合にarray_valuesを使うことで、改めてインデックスを0から連続した数値キーに再割り当てできます。
例:
<?php
$arr = [0 => 'a', 1 => 'b', 2 => 'c'];
unset($arr[1]);
$result = array_values($arr);
print_r($result);
?>
unset後は[0]と[2]だけが残りますが、array_valuesによって[0] => ‘a’,[1] => ‘c’にリセットされます。
多次元配列との連携例
配列の要素がさらに配列である多次元構造で、内部の配列にも連想形式のものが含まれる例を考えます。上位の配列に対してarray_valuesを使うことで、外側のキーをすべて捨て、内側はそのまま保たれることがあります。
例:
<?php
$data = [
"user1" => ["id" => 1, "name" => "Alice"],
"user2" => ["id" => 2, "name" => "Bob"]
];
$out = array_values($data);
print_r($out);
?>
出力は0番と1番の要素としてそれぞれの連想配列が入った配列となり、外側のキー user1,user2 は捨てられますが内側のキーは保持されます。
array_values 連想 配列 の技術的な注意点と限界
array_valuesは非常に有用ですが、使う際にはパフォーマンスやキーの取り扱いなど意識すべき条件があります。誤用や予期しない結果を避けるために、以下のような注意点を知っておいたほうがよいです。
キー情報が必要なケースでは使えない
もし元の配列のキーを後で参照する必要があるなら、array_valuesで捨ててしまうと復元できません。キーを使ってアクセスする処理や特定のラベルに基づく処理がある場合、値だけを抜き出す前にキーと値の両方を保持する設計を考えるべきです。
メモリ使用量と再構築のコスト
array_valuesは新しい配列を作るため、非常に大きな配列を扱う際にはメモリ足りなくなることがあります。特に連想配列の要素数が極端に多い場合や、他の大きな構造と組み合わせて使うときには注意が必要です。
また、オリジナル配列が巨大なとき、array_valuesを呼び出すことで再配置やガーベジコレクションが発生する可能性があり、その分処理時間がかかります。
順序が意図と異なることがある
連想配列の順序は挿入順やキーの追加順に依存します。array_valuesはその順序を保持しますが、unsetや別操作の後では順序にギャップが生じたり、元のキーの値が想定外の順序になることがあります。
また、キーが文字列の場合は比較できない順序になることもあり、その状態でarray_valuesを用いても“挿入順”に依存するので意図どおりかを確認すべきです。
array_values 連想 配列 と似た関数や代替手段の比較
値だけを取り出す操作はarray_values以外にもいくつかの方法があります。それぞれ使いどころが異なりますので、比較して理解しておくことで選択肢が広がります。
array_keysとの比較
array_keys関数は配列のキーのみを取得するもので、値は含まれません。array_valuesとは正反対の役割です。キーと値の両方を別々に使いたい場合にはこの組み合わせが便利です。
array_columnを使うケース
多次元配列で特定のキーに対応する値だけを抜き出したいときは、array_columnが有力です。例えば、複数のユーザー配列があり「name」だけを取り出すような場合、array_columnを使えば外側のキーを無視してそのキーに対応する値のリストを取得できます。
配列操作ライブラリやCollectionクラスとの併用
フレームワークによっては、配列やコレクションを操作するためのユーティリティが豊富に用意されており、値のみ抽出したりキーを意図的に捨てたりするメソッドが使えることがあります。こうしたライブラリを用いると可読性や保守性が上がることがあります。
ただし、内部でarray_valuesを使っていたり似たような処理を行っていることが多いため、動作を理解したうえで使うことが重要です。
array_values 連想 配列 を使った応用テクニックと実践コード
ここでは実務でよく使われる応用例をいくつかご紹介します。単純な抜き出し以上の工夫や組み合わせで、より柔軟で強力に活用できます。
filter後の値のみリスト化
配列から特定の条件で要素を取り除いた後、残った要素を値リストとして扱いたい場面です。まずfilter(array_filterなど)で不要な要素を除き、その結果をarray_valuesで再インデックスして値だけの連続配列を得ます。
例:
<?php
$assoc = [ "a" => 10, "b" => 20, "c" => 30 ];
$filtered = array_filter($assoc, fn($v) => $v > 15);
$values = array_values($filtered);
// $values は [0] => 20, [1] => 30
?>
APIレスポンスで値のみ返すべきとき
REST APIやGraphQLなどでクライアントには不要なキーまで送らず、値だけのシンプルな配列を返したいときにarray_valuesは役立ちます。例えば「products」の配列を返す際にIDを使わず値リストとして扱いたいケースなどが典型です。
動的なデータ構造への適用
ユーザー入力やデータベースクエリから取得した結果をそのまま処理したいとき、キーの有無や形式が一定でないことがあります。そういった変則的な構造を整理してからさらに処理を続けたいときに、array_valuesを使ってまず値リストにし、その後mapやreduce処理を行うという流れが安全です。
array_values 連想 配列 を使う上でのパフォーマンスとベストプラクティス
最新情報を踏まえて、array_valuesを導入する際の性能上の影響と最適な使い方を紹介します。コード効率、メモリ消費、設計の観点から見ておく価値があります。
大きな配列への負荷
要素数が非常に多い連想配列をarray_valuesで処理すると、新しい配列が作られるためメモリ消費が一時的に増えます。またコピーの際のオーバーヘッドや操作回数によってはCPU時間も無視できない影響があります。巨大な配列やリアルタイム処理が関わる場合には注意が必要です。
不要な再構築を避ける設計
元のキー情報が使用される可能性があるなら、不要にarray_valuesでキーを捨てるべきではありません。値だけが必要な部分だけで使うように切り分ける設計が望ましいです。例えば関数やメソッドの中で配列を引数として受け取る際に、キーを必要とするかどうかを明確にしておくとよいです。
予期せぬ型のキーや値の混在に対する防御的コード
キーが混在していたり、値が配列やオブジェクトであるなど、データ型が揺らぎやすいケースもあります。array_valuesを使う前に型チェックやネストの深さを確認したり、nullやfalseなどの値を含めないようにフィルタリングしておくことで予期しない動作を防げます。
まとめ
array_valuesは連想配列からキーを無視して値だけを取得し、数値インデックスで再構成された配列を得たいときの非常に強力なツールです。unset操作後のギャップ補正、多次元配列の外側キーの除去、APIレスポンスの整形など、多くの場面で役立ちます。
ただし、キーが後で必要となる場面では使用を避けるべきですし、大きな配列に対してはメモリと時間のコストも考慮する必要があります。代替手段としてarray_keysやarray_column、フレームワークのCollectionクラスなどと組み合わせることで、より柔軟で安全なコードを書くことができます。
総じて、値だけを扱いたいときにarray_valuesを活用し、キーを使う必要があるかどうかを設計段階で判断することが、読みやすく保守性の高いPHPコードを書くポイントになります。
コメント