Laravelにはヘルパ関数と呼ばれる利便性の高いグローバル関数が多数存在します。
今回はその中で配列を操作する際に重宝する関数をまとめて紹介します。
各関数でPHP標準にも同じ様な関数がある場合は紹介しています。臨機応変に使い分けていきましょう。
Arr::add()
キーと値のペアをそのキーが存在していない場合とnullがセットされている場合に、配列に追加
$array = Arr::add(['name' => 'Desk'], 'price', 100);
// ['name' => 'Desk', 'price' => 100] キーと値のペアが存在しない場合に追加
$array = Arr::add(['name' => 'Desk', 'price' => null], 'price', 100);
// ['name' => 'Desk', 'price' => 100] 値がnullの場合に追加
$array = Arr::add(['name' => 'Desk', 'price' => 100], 'price', 200);
// ['name' => 'Desk', 'price' => 100] キーと値のペアが存在する場合は設定されない関数の紹介などに使えるテンプレです。
PHPでは
array_merge();
$array['price'] = 200;
でも連想配列に追加できます。
違いはArr::addでは値が上書きされません。
Arr::collapse()
複数の配列を一つの配列にまとめられる
$array = Arr::collapse([
['name'=>'yamada'],
['age'=>22],
['emial'=>'a@test.com']
]);
//["name" => "yamada","age" => 22,"emial" => "a@test.com"]
複数テーブルから取得したデータを一つにまとめて、foreachなどで処理する場合に使えそうですね。
Arr::crossJoin()
配列を結合して全ての組み合わせを作る
use Illuminate\Support\Arr;
$matrix = Arr::crossJoin([1, 2], ['a', 'b']);
// [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']]
2つのマスタテーブルから全ての組み合わせを取得したい場合に使えます
Arr::divide()
配列をキーと値に分ける
use Illuminate\Support\Arr;
[$keys, $values] = Arr::divide(['id' => '1','name'=>'yamada','age'=>33]);
print_r($keys); //Array([0] => id [1] => name [2] => age)
print_r($values); //Array([0] => 1 [1] => yamada [2] => 33)
Arr::divide(App\User::first()->toArray());
とすれば、DBから取得したデータを配列化して、キーと値に分割できますね。
Arr::except()
指定されたキーで配列要素を削除
use Illuminate\Support\Arr;
$array = ['id' => 1, 'name' => 'test','age'=>25];
$result=Arr::except($array, ['name','age']);
print_r($result);
// Array([id] => 1)
複数のキーを指定して要素を削除可能です。
PHP標準関数では「unset」でも同じ様に削除できます。
unset($array['name'],$array['age']);
Arr::first()
条件にマッチする最初の要素を取得
use Illuminate\Support\Arr;
$scores = [10, 20, 30, 40];
$first = Arr::first($scores, function ($value, $key) {
return $value >= 25;
});
echo $first; //30
配列の値をソートすれば、何らかの処理に使えそう
Arr:: flatten()
多次元配列を一次元配列に変換
use Illuminate\Support\Arr;
$array = ['name' => 'Joe', 'age'=>23];
print_r(Arr::flatten($array));
// Array([0] => Joe [1] => 23)
以下のように使うとUserテーブルの名前だけをリスト化して取得できます。
Arr::flatten(App\User::select('name')->get()->toArray());
Arr::forget()
ネストされた配列をドット記法で削除できる
use Illuminate\Support\Arr;
$array=['user'=>['id'=>1,'name'=>'test']];
Arr::forget($array, 'user.name');
print_r($array); //Array([user] => Array([id] => 1))
withメソッドで取得したリレーションデータの一部を削除する場合なんかに使えそう
Arr::get()
ネストされた配列をドット記法で取得できる
use Illuminate\Support\Arr;
$array = ['user' => ['job' => ['name' => 'director']]];
echo Arr::get($array, 'user.job.name'); //director
//値が存在しない場合のデフォルト値も指定できる
echo Arr::get($array, 'user.job.skill','なし'); //なし
APIなどでデータ取得する際にキーが返却されない場合などがあるので、デフォルト値が指定できるのは助かりますね。
Arr::has()
連想配列のキーが存在するかドット記法でチェック
use Illuminate\Support\Arr;
$array = ['user' => ['name' => 'yamada', 'age' => 33]];
Arr::has($array, user.name'); //true
Arr::has($array, ['user.name', 'user.age']); //true
Arr::has($array, ['user.name', 'user.job']); //false
ネストされた配列をチェックできます。複数指定も可能。
APIで取得したキーが存在するかチェックする場合などに使えそうですね。
Arr::isAssoc()
連想配列の場合、Trueを返す
use Illuminate\Support\Arr;
Arr::isAssoc(['user' => ['name' => 'test', 'age' => 24]]); //連想配列
//true
Arr::isAssoc(['a','b','c']); //添字配列
//false
連想配列か添字配列かを確認したい時に使えますね。
ちなみにPHP標準だと以下で確認可能。
array_values($arr) === $arr
添字配列の場合にTrueを返します。
Arr::last()
条件を満たす最後の要素を取得する
use Illuminate\Support\Arr;
$array = [400, 100, 200, 300, 110];
$last = Arr::last($array, function ($value, $key) {
return $value >= 150;
});
//300
配列要素を並び替えれば、要素内の最大値を取得する場合などに使えそう。
ちなみに最初の要素は
Arr::first()
で取得可能になります。
Arr::only()
指定したキーの配列を取得する
use Illuminate\Support\Arr;
$array = ['name' => 'test', 'age' => 32, 'email' => 'a@test.com'];
Arr::only($array, ['name','email']);
// ["name" => "test","email" => "a@test.com",]
DBから全カラムを取得し、ある処理だけ特定のカラムでループさせたい場合などに使えそう
Arr::pluck()
キーを指定し連想配列から新たな配列を作る
use Illuminate\Support\Arr;
$array = [
['user' => ['id' => 1, 'name' => 'yamada']],
['user' => ['id' => 2, 'name' => 'suzuki']]
];
Arr::pluck($array, 'user.name');
//["yamada","suzuki"]
Arr::pluck($array, 'user.name','user.id'); //キーを指定して連想配列も作れる
// [1 => "yamada", 2 => "suzuki"]
PHP標準の「array_column」関数と似ていますが、「Arr:pluck」は入れ子になった連想配列でもドット記法で抽出できるので便利ー。
Arr::prepend()
配列の先頭に要素を追加する
use Illuminate\Support\Arr;
$array = ['bbb', 'ccc', 'ddd'];
$array = Arr::prepend($array, 'aaa');
// ['aaa','bbb','ccc','ddd']
//キーを指定して連想配列の先頭に追加
$array = ['age' => 33];
$array = Arr::prepend($array, 'yamada', 'name');
// ['name' => 'yamada', 'age' => 33]
キーを指定して連想配列の先頭にも追加できます。
PHP標準関数で連想配列に追加する場合
array_merge(['name'=>'yamada'],$array);
で可能です。
Arr::pull()
指定したキーの値を取得し、連想配列から削除
use Illuminate\Support\Arr;
$array = ['name' => 'yamada', 'age' => 33];
$name = Arr::pull($array, 'name');
print_r($name); //yamada
print_r($array); //Array([age] => 33)
PHP標準だと以下の様になります。
$name=$array['name'];
unset($array['name']);
Arr::random()
配列からランダムに値を取得できる
use Illuminate\Support\Arr;
$array=['apple', 'orange' ,'grape', 'banana'];
$random = Arr::random($array);
// orange
//返却数も指定可能。パラメーターを指定すると配列で返却されます
$items = Arr::random($array, 2);
// ["apple","banana",]
//連想配列の指定も可能です。
$array=['apple'=>'100円', 'orange'=>'200円' ,'grape'=>'300円'];
Arr::random($array); //200円
Arr::query()
配列からURL エンコードされたクエリ文字列を生成
use Illuminate\Support\Arr;
$array = ['id' => 1, 'user' => ['name' => 'yamada', 'age' => 32]];
Arr::query($array);
//id=1&user[name]=yamada&user[age]=32
print_rなどで出力すると[]はURLエンコードされます。
PHP標準では
http_build_query
で可能です
Arr::set()
深くネストした配列にドット記法で設定できる
use Illuminate\Support\Arr;
$array = ['entry' => ['user' => ['name' => 'yamada']]];
Arr::set($array, 'entry.user.name', 'suzuki');
// ['entry' => ['user' => ['name' => 'suzuki']]]
$array['entry']['user']['name']='suzuki';
↑は[]とシングルクォーテーションのキー操作が結構面倒
Arr::shuffle()
配列中の要素をランダムにシャッフル
use Illuminate\Support\Arr;
$array = Arr::shuffle(["a", "b", "c", "d", "e"]);
//["e","a","c","b","d"]
PHP標準には「array_rand」関数があります。
こちらは以下のようにランダムにしたキーが返却されます。また返却数も指定可能
array_rand($array, 3);
//array([0] => 0 [1] => 2 [2] => 3])
Arr::sort()
連想配列を指定したキーの値でソートする
use Illuminate\Support\Arr;
$array = [
['name' => 'yamada','age' => 41],
['name' => 'suzuki','age' => 53],
['name' => 'sato','age' => 22]
];
$sorted = array_values(Arr::sort($array, function ($value) {
return $value['age'];
}));
$array = [
['name' => 'sato','age' => 22],
['name' => 'yamada','age' => 41],
['name' => 'suzuki','age' => 53]
];
PHP標準で同じようにソートする場合は「array_multisort」で可能です。
以下のように通常の配列でもソートできます
Arr::sort([3,5,2,1]) //[1,2,3,5]
Arr::where()
配列の要素をフィルタリングする
use Illuminate\Support\Arr;
$array=[200,300,100,500,400];
$filtered = Arr::where($array, function ($value, $key) {
return $value > 200;
});
//[1=>300, 3=>500, 4=>400]
PHP標準だと「array_filter」で同じようにフィルタリングできます。
ただ「array_filter」はkeyをパラメータで渡す場合、「ARRAY_FILTER_USE_BOTH」オプションを指定する必要があり少し面倒。
他にもまだ配列操作系の関数はあるので追加していきます。