【PHP】配列からIDだけを取り出したい

# はじめに

こんにちは、エンジニアのkeitaMaxです。

今回はなにをやりたいかというと、
```php
$array = [
    ["id" => 1, "name" => "taro"],
    ["id" => 2, "name" => "jiro"],
    ["id" => 3, "name" => "saburo"]
];
```
こんな配列からidの部分だけ抜き足して
```php
$array = [1,2,3];
```
みたいなidだけの配列にしたいということです。

# 試したこと① foreach

まずは無難なforeachで試してみました。

```php
$array = [
    ["id" => 1, "name" => "taro"],
    ["id" => 2, "name" => "jiro"],
    ["id" => 3, "name" => "saburo"]
];

$result = [];
foreach($array as $value){
    array_push($result, $value['id']);
}

print_r($result);

// 出力結果
// Array ( [0] => 1 [1] => 2 [2] => 3 )
```

これでもできるけど、foreachとかarray_pushを使うと分かりにくくなってしまうため、
別の方法を探したいと思い調べると`array_column`というよさそうな関数が用意されていました。

# 試したこと② array_column

>入力配列から単一のカラムの値を返す
(https://www.php.net/manual/ja/function.array-column.php から引用)

公式にはこのように書いてありました。

さっそく使ってみます。

```php
$array = [
    ["id" => 1, "name" => "taro"],
    ["id" => 2, "name" => "jiro"],
    ["id" => 3, "name" => "saburo"]
];

$result = array_column($array, "id");

print_r($result);

// 出力結果
// Array ( [0] => 1 [1] => 2 [2] => 3 )
```
すごいスマートになった！

# もう少し踏み込んでみる
```php
$array = [
    ["id" => 1, "name" => "taro"],
    ["id" => 2, "name" => "jiro"],
    ["id" => 3, "name" => "saburo"]
];
```
こんな感じの配列なら簡単にできましたが、今度は少し配列の次元を上げてみた時を考えてみようと思います。

```php
$array = [
    ["id" => 1,"name" => "taro","test_scores" => ["math" => 25, "science" => 59]],
    ["id" => 2,"name" => "jiro","test_scores" => ["math" => 66, "science" => 19]],
    ["id" => 3,"name" => "saburo","test_scores" => ["math" => 40, "science" => 80]]
];
```

こんな配列から、mathの値だけの配列が欲しい時を考えます。

```php
$array = [25,66,40];
```

### 結論

```php
$array = [
    ["id" => 1, "name" => "taro", "test_scores" => ["math" => 25, "science" => 59]],
    ["id" => 2, "name" => "jiro", "test_scores" => ["math" => 66, "science" => 19]],
    ["id" => 3, "name" => "saburo", "test_scores" => ["math" => 40, "science" => 80]]
];

$testScores = array_column($array, "test_scores");
$result = array_column($testScores, "math");

// 出力結果
// Array ( [0] => 25 [1] => 66 [2] => 40 )
```

こんな感じで順番に`array_column`で値をとっていくと簡単にできます。


もしくは、`array_map`で下のようにコールバック関数でまとめるかです。

```php
$array = [
    ["id" => 1, "name" => "taro", "test_scores" => ["math" => 25, "science" => 59]],
    ["id" => 2, "name" => "jiro", "test_scores" => ["math" => 66, "science" => 19]],
    ["id" => 3, "name" => "saburo", "test_scores" => ["math" => 40, "science" => 80]]
];

function mathTestScores($value)
{
    return $value["test_scores"]["math"];
}

$result = array_map("mathTestScores", $array);

print_r($result);
// 出力結果
// Array ( [0] => 25 [1] => 66 [2] => 40 )
```

個人的には順番に`array_column`で順番に値を取得しいく方法がわかりやすくていいかなと思いました。
`array_map`は関数でまとめたいときとかが便利かなと思いました。


# おまけ　どんな次元の配列でも値をとれるように関数化

1階層目のIDが欲しい時、2階層目のIDが欲しい時、3階層目のIDが欲しい時、、、、

というときに使えるような一つの関数にしてみました。

```php
function associative($value, ...$keys)
{
    $result = $value;
    foreach($keys as $key){
        $result = array_column($result, $key);
    }
    return $result;
}

print_r(associative($array, "test_scores", "math"));
// 出力結果
// Array ( [0] => 25 [1] => 66 [2] => 40 )

print_r(associative($array, "name"));
// 出力結果
//Array ( [0] => taro [1] => jiro [2] => saburo )
```

使うところはかなり限られてくると思いますが、作ってみました。

# おわりに

もっとスマートなやり方があるだったり、ここ間違っているよというのがあればぜひご指摘していただければと思います。

最後までお読みいただきありがとうございました。

# 参考文献

https://www.php.net/manual/ja/function.array-column.php