PHPのarray_columnの使い方: 多次元配列の列を抽出する

52, 2020-09-20

目次

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であればそのままメンバ変数名を指定できますが、privateprotectedであればマジックメソッドの__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の返り値として適当なものを答えよ

  1. 文字列

  2. 整数

  3. 配列

Q2: array_columnの第1引数として適当なものを答えよ

  1. 配列

  2. 2次元配列

  3. オブジェクトの配列

Q3: array_columnでオブジェクトの配列からオブジェクトのプライベートなメンバ変数を取得したい。対策として適当なものを答えよ

  1. オブジェクトに__getのみを実装する

  2. オブジェクトに__issetのみを実装する

  3. オブジェクトに__getと__issetを実装する


正解はこちら↓

Q1: 3
Q2: 2, 3
Q3: 3