Laravelのコレクション(その10:条件分岐/コレクション生成)

0
85

Laravelコレクション掘り下げシリーズ第十弾。今回は条件分岐メソッド、およびコレクション生成を行うメソッドに関して確認していきます。
例によって両者に特に密接な関係がある訳ではないのですが、これら分類に属するメソッド数が少ないため、まとめて整理します。

unless

$col = collect([1,2,3]);

$condition = true;
$col->unless($condition, function($collection) {
    return $collection->push(4);
});

$condition = false;
$col->unless($condition, function($collection) {
    return $collection->push(5);
});

第一引数が偽の場合のみコールバックの内容を実行します。元コレクション自体が更新される点に注意が必要です。
またコールバックの引数は当該コレクション自身である点も要注意です。
結果は以下の通り。

array:4 [
  0 => 1
  1 => 2
  2 => 3
  3 => 5
]

when

$col = collect([1,2,3]);

$condition = true;
$col->when($condition, function($collection) {
    return $collection->push(4);
});

$condition = false;
$col->when($condition, function($collection) {
    return $collection->push(5);
});

unlessの逆で、第一引数が真の場合のみコールバックの内容を実行します。
結果は以下の通り。

array:4 [
  0 => 1
  1 => 2
  2 => 3
  3 => 4
]

whenEmpty(unlessNotEmpty) 

$col = collect([1,2,3]);

$col->whenEmpty(function($collection) {
    return $collection->push(4);
});

$col = collect([]);

$col->whenEmpty(function($collection) {
    return $collection->push(5);
});

元コレクションが空の場合のみコールバックが実行されます。例によって、コールバックの引数はコレクション自身で、コールバックの実行結果も自身に反映されます。
unlessNotEmptyはエイリアスです。
結果は以下の通り。

(1つ目の実行結果)
array:3 [
  0 => 1
  1 => 2
  2 => 3
]
(2つ目の実行結果)
array:1 [
  0 => 5
]

whenNotEmpty(unlessEmpty)  

$col = collect([1,2,3]);

$col->whenNotEmpty(function($collection) {
    return $collection->push(4);
});

$col = collect([]);

$col->whenNotEmpty(function($collection) {
    return $collection->push(5);
});

whenEmptyの逆で、元コレクションが空でない場合のみコールバックが実行されます。
unlessEmptyはエイリアスです。
結果は以下の通り。

(1つ目の実行結果)
array:4 [
  0 => 1
  1 => 2
  2 => 3
  3 => 4
]
(2つ目の実行結果)
[]

collect

今まで様々なサンプルで使ってきましたので今更ですが、コレクションを生成します。
使い方は例示するまでもないかと。

make

$col = \Illuminate\Support\Collection::make([1,2,3]);

コレクションを生成します。
ネット情報などでは下記のような簡易な書式でも有効であるように書かれていますが、少なくとも私が試した範囲ではダメでした。

$col = Collection::make([1,2,3]);

いずれにしても、collectを使った方が簡単なので、本メソッドを使うことはないと思いますが…

times

$col = \Illuminate\Support\Collection::times(3, function($num) {
    return [
        'num' => $num,
        'square' => $num * $num,
    ];
});

第一引数に指定した数だけ、第二引数で指定したコールバックを呼び出し、その結果で新しいコレクションを生成します。
コールバックの引数は何回目の呼び出しか(1、2、3…)が渡されます。
結果は以下の通り。

array:3 [
  0 => array:2 [
    "num" => 1
    "square" => 1
  ]
  1 => array:2 [
    "num" => 2
    "square" => 4
  ]
  2 => array:2 [
    "num" => 3
    "square" => 9
  ]
]

unwrap

$result = \Illuminate\Support\Collection::unwrap(collect([1,2,3]));
echo gettype($result)."\n"; // array

$result = \Illuminate\Support\Collection::unwrap([1,2,3]);
echo gettype($result)."\n"; // array

$result = \Illuminate\Support\Collection::unwrap(1);
echo gettype($result)."\n"; // integer

コレクションから本体配列を抽出する処理です。
引数で指定したデータがコレクション以外であればそのデータがそのまま返されるようです。

wrap

$col1 = \Illuminate\Support\Collection::wrap(collect([1,2,3]));
dump($col1->toArray());

$col2 = \Illuminate\Support\Collection::wrap([1,2,3]);
dump($col2->toArray());

$col3 = \Illuminate\Support\Collection::wrap(1);
dump($col3->toArray());

unwrapの逆で、引数で指定したデータを持つコレクションを生成しますが、コレクションが指定された場合はそのまま返されます。
上記結果は以下の通り。

($col1)
array:3 [
  0 => 1
  1 => 2
  2 => 3
]
($col2)
array:3 [
  0 => 1
  1 => 2
  2 => 3
]
($col3)
array:1 [
  0 => 1
]

しかし、引数に指定する値の型が不定ってことはあまりないと思いますし、普通にcollectを使えば良いように思いますが?

総括

このカテゴリに属すメソッドに関してはcollectを除いて使ったことがなく、今後もあまり使うことがなさそうな印象です。
と言うことで、あまりコメントすることもなく、今回は終了。