PHPのarray_columnの使い方: 多次元配列の列を抽出する
目次
- PHPのarray_columnの使い方
- array_columnの構造
- 整数行列から特定の列を取得する
- 連想配列の行列から特定の列を取得する
- 特定の列をインデックスにして列を取得する
- オブジェクトの配列からメンバ変数をまとめて取得する
- privateなメンバ変数をまとめて取得する
- 問題
PHPのarray_columnの使い方
PHPには多次元配列や行列になっているオブジェクトの列を一括で取得できる関数array_column
があります。
array_column
は例えば↓のように使います。
<?php $matrix = [ [0, 1, 2], [3, 4, 5], [6, 7, 8], ]; $cols = array_column($matrix, 0); print_r($cols); ?>
出力結果。
Array ( [0] => 0 [1] => 3 [2] => 6 )
array_columnの構造
array_column
は↓のような構造をしています。
array_column(配列, 列キー, インデックスキー);
配列(第1引数)
第1引数には処理対象の配列を渡します。
この配列には2次元配列や、オブジェクトを格納した配列などを渡せます。
列キー(第2引数)
第1引数の配列から取得する列のキーを指定します。
たとえば整数の行列であれば、列キーは整数になり、連想配列の行列であれば列キーは文字列などが適当な値になります。
オブジェクトを格納した配列であれば、列キーはメンバ変数名などになります。
オブジェクトのメンバ変数がpublic
であればそのままメンバ変数名を指定できますが、private
やprotected
であればマジックメソッドの__get
と__isset
を実装する必要があります。
インデックスキー(第3引数)
array_column
はこの第3引数のインデックスキーの値をキーにして結果の配列を返します。
この引数は省略可能です。
返り値
第2引数の列キーで取得した列を配列として返します。
整数行列から特定の列を取得する
整数の行列の1番目(0オリジン)の列をまとめて取得したい場合は↓のようにします。
<?php $matrix = [ // ↓この列を得る [0, 1, 2], [3, 4, 5], [6, 7, 8], ]; $cols = array_column($matrix, 1); print_r($cols); ?>
出力結果。
Array ( [0] => 1 [1] => 4 [2] => 7 )
連想配列の行列から特定の列を取得する
連想配列の行列から特定の列をまとめて取得したい場合もキーを指定します。
↓の場合、name
のキーの列を取得します。
<?php $matrix = [ [ 'name' => 'Taro', 'age' => 12, ], [ 'name' => 'Jiro', 'age' => 31, ], [ 'name' => 'Ken', 'age' => 74, ], ]; $names = array_column($matrix, 'name'); print_r($names); ?>
出力結果。
Array ( [0] => Taro [1] => Jiro [2] => Ken )
特定の列をインデックスにして列を取得する
array_column
の第3引数のインデックスキーの使用例です。
インデックスキーに配列中のキーを指定すると、そのキーの値をインデックスにした結果が得られます。
たとえば↓の場合はid
の値をインデックスにして結果を取得しています。
<?php $matrix = [ [ 'id' => 100, 'name' => 'Taro', 'age' => 12, ], [ 'id' => 101, 'name' => 'Jiro', 'age' => 31, ], [ 'id' => 102, 'name' => 'Ken', 'age' => 74, ], ]; $names = array_column($matrix, 'name', 'id'); print_r($names); ?>
出力結果。
Array ( [100] => Taro [101] => Jiro [102] => Ken )
結果の配列のキーがid
の値になっているのがわかります。
オブジェクトの配列からメンバ変数をまとめて取得する
パブリックなメンバ変数を持つオブジェクトの入った配列から、そのメンバ変数の値をまとめて取得するには↓のようにします。
array_column
の第2引数の列キーにメンバ変数名を指定します。
<?php class Person { public $name; public function __construct(string $name) { $this->name = $name; } } $persons = [ new Person('Taro'), new Person('Jiro'), new Person('Ken'), ]; $names = array_column($persons, 'name'); print_r($names); ?>
出力結果。
Array ( [0] => Taro [1] => Jiro [2] => Ken )
privateなメンバ変数をまとめて取得する
array_column
で、オブジェクトの入った配列から、オブジェクトのprivate
なメンバ変数やprotected
なメンバ変数を取得したい場合は、オブジェクトがマジックメソッドの__get
, __isset
を実装している必要があります。
<?php class Person { private $age; public function __construct(int $age) { $this->age = $age; } public function __get($prop) { return $this->$prop; } public function __isset($prop) : bool { return isset($this->$prop); } } $persons = [ new Person(32), new Person(16), new Person(91), ]; $names = array_column($persons, 'age'); print_r($names); ?>
出力結果。
Array ( [0] => 32 [1] => 16 [2] => 91 )
問題
Q1: array_column
の返り値として適当なものを答えよ
文字列
整数
配列
Q2: array_column
の第1引数として適当なものを答えよ
配列
2次元配列
オブジェクトの配列
Q3: array_column
でオブジェクトの配列からオブジェクトのプライベートなメンバ変数を取得したい。対策として適当なものを答えよ
オブジェクトに__getのみを実装する
オブジェクトに__issetのみを実装する
オブジェクトに__getと__issetを実装する
正解はこちら↓
Q1: 3
Q2: 2, 3
Q3: 3