【PHP】array_cloumnで配列の整形

php

状況

DBから取ってきたデータ同士を上手く整形させて、配列を作り直したい。
一方の配列をidの集まりだとして、他方それに合うように整形したい場合。
foreachを使うと冗長になりがちな場合。例えば、片方でidリストを作成しておいて、もう片方でDBから取ってきた諸々のデータを比較する場合、それをforeachでやろうとすると入れ子にして冗長になる。breakを使い、意図した配列になったら抜けようとしても同じ感じ。array_columnを併用してforeachを1回にする。

array_cloumn

基本形

第一引数にDBから取得してきた配列を、第二引数に取得したいidを。

$hoge= [
 ['id' => 101,
   'name' => 'John',
  ],
 ['id' => 288,
   'name' => 'taro',
 ],
];
/*
var_dump(array_column($hoge, 'id'));
array(2) {
  [0]=>
  int(101)
  [1]=>
  int(288)
}*/

第三引数を使い、特定のkeyで並び替えた配列を作り直す

第二引数にnameを取り、第三引数にidを取ることで、idをkeyにして並び替えることができる。

$hoge= [
 ['id' => 101,
   'name' => 'John',
  ],
 ['id' => 288,
   'name' => 'taro',
 ],
];
/*
var_dump(array_column($hoge, 'name','id'));
array(2) {
  [101]=>
  string(4) "John"
  [288]=>
  string(4) "taro"
}*/

オブジェクトを扱う場合

Hogeクラスのhogehogeプロパティ’id’、’name’からそれぞれ取得する場合。
これも同様に、第三引数にidを持ってきてやれば、idをkeyにした配列を作り直せる。

<?php
class Hoge
{
    public $hogehoge;

    public function __construct(string $hogehoge,int $hoge_id)
    {
        $this->id = $hoge_id;
        $this->name = $hogehoge;
    }
}

$piyo = [
    new Hoge('John',101),
    new Hoge('taro',288),
    new Hoge('hogeo',333),
];

/*
print_r(array_column($piyo, 'id'));
print_r(array_column($piyo, 'name','id'));
Array
(
    [0] => 101
    [1] => 288
    [2] => 333
)
Array
(
    [101] => John
    [288] => taro
    [333] => hogeo
)*/

これでkeyがid、valueがnameになった配列ができて、元々のDBから取ってくる配列をforeachで回してやり、idに適合するものを条件分岐させて配列を作り直せた。

以上

参照

array_column
入力配列から単一のカラムの値を返す

php, programming

Posted by himajinn