.Dev.Record

#624301f9e7221

【Laravel】ヘルパ関数の紹介 配列編6【toCssClasses、undot、where、whereNotNull、wrap】

2022.03.29

test

前回に引き続き本記事でもLaravelの配列関連のへルパ関数を解説していきたいと思います。

参考になれば幸いです。

Memo

Laravelのバージョンは8系統になります。

今回解説するへルパ関数は以下です。

本記事で取り扱うへルパ関数

  • Arr::toCssClasses CSSのクラス文字を生成
  • Arr::undot ドット記法を用いた一次元配列を多次元配列に変換
  • Arr::where クロージャーを使用して配列要素をフィルタリング
  • Arr::whereNotNull 配列ないからnull要素を削除
  • Arr::wrap 指定した値を配列にラップ

本記事以外の配列のへルパ関数は下記からどうぞ!!

Arr::toCssClasses CSSのクラス文字を生成

配列を条件付きでCSSクラス文字に変換します。

toCssClasses

Arr::toCssClasses(配列): CSSクラス文字

  • 指定した配列をCSSクラス文字へ変換
  • 連想配列の場合は要素がtrueの場合にキーをCSSクラス文字へ変換
  • 添字配列の場合は常に要素をCSSクラス文字へ含める
  • 多次元配列は使用不可(エラー)
  • コレクションもエラーにはならないが正しい挙動にならない

配列をCSSのクラス文字に変換します。CSSのクラス文字とはHTMLタグに指定するclassのことです。 例えば、下記で言うとmain-content activeclassになります。

classを含んだHTMLタグ

1<div class="main-content active">
2    <p>コンテンツ内容</p>
3</div>

Arr::toCssClassesはこのclassの文字列を配列から生成するへルパ関数になります。

下記が使用例になります。

使用例

1// クラス文字列の元になる配列
2$array = ['class-1' => true, 'class-2' => false, 'class-3'];
3Arr::toCssClasses($array);
4
5// 結果(指定した配列からクラス文字列を生成)
6"class-1 class-3"

例からも分かるように、クラス文字列として生成される要素には条件があります。

キーが含まれた要素の場合は値がtrueの場合にキーの文字列がクラス文字列として生成されます

falseの場合はクラス文字列として生成されません。

上記の使用例では'class-1' => true'class-2' => false がキーを含んだ要素にあたり、

その中でも'class-1' => trueは値がtrueであるため、キーであるclass-1クラス文字列として生成されています

キーが含まれている要素

  • 値がtrueの場合、キーがクラス文字列として生成される。
  • 値がfalseの場合、クラス文字列として生成されない。

添字配列の要素は常にクラス文字列として生成されます

こちらも先程の使用例では'class-3'が添字配列の要素にあたり、クラス文字列として生成されているのがわかります。

添字配列の要素

  • 値の文字列が常にクラス文字列として生成される。

多次元配列の場合はエラーになり使用できません。

多次元配列を使用(エラー)

1$array = ['class-1' => true, 'class-2' => false, ['class-3', 'class-4']];
2Arr::toCssClasses($array);
3
4// エラー
5// Array to string conversion

例では['class-3', 'class-4']部分が多次元配列になっているためArray to string conversionのエラーが出ています。

また、コレクションの場合もエラーにはなりませんが、クラス文字列として生成されないため使用しない方がいいです

コレクションを使用(エラー)

1$collection = Collection::make(['class-1' => true, 'class-2' => false]);
2Arr::toCssClasses($collection);
3
4// 結果(要素がそのまま文字列として生成されてしまう)
5"{"class-1":true,"class-2":false}"

例ではコレクション内の要素がそのまま文字列として出力されてしまっています。コレクションでの使用は避けましょう。

Arr::undot ドット記法を用いた一次元配列を多次元配列に変換

ドット記法を用いた一次元配列を多次元配列に変換します

undot

Arr::undot(配列): 配列

  • ドット記法の一次元配列を多次元配列に変換
  • コレクションも使用可能

使用例は以下の通りで、ドット記法部分を多次元配列に展開してくれます。

使用例

1$array = ['key1.key1-1' => 1, 'key1.key1-2' => 2, 'key2' => 3];
2Arr::undot($array);
3
4// 結果(ドット記法を用いた要素が配列として展開される)
5array:2 [6  "key1" => array:2 [7    "key1-1" => 1
8    "key1-2" => 2
9  ]
10  "key2" => 3
11]

この例では、配列内でドット記法を用いているキーkey1.key1-1key1.key1-2になるので、下記のように展開されています。

展開部分の例

1"key1" => array:2 [2  "key1-1" => 1
3  "key1-2" => 2
4]

コレクションでも使用できます。

コレクション

1$collection = Collection::make(['key1.key1-1' => 1, 'key1.key1-2' => 2, 'key2' => 3]);
2Arr::undot($array);
3
4// 結果
5array:2 [6  "key1" => array:2 [7    "key1-1" => 1
8    "key1-2" => 2
9  ]
10  "key2" => 3
11]

Arr::where クロージャーを使用して配列要素をフィルタリング

クロージャー関数を使用して配列の要素をフィルタリングできます。

where

Arr::where(配列, クロージャー関数): フィルタリング後の配列

  • クロージャー関数内でフィルタリングの条件を指定し要素毎にクロージャー関数を実施
  • クロージャー関数内では要素の値とキーが渡される
  • クロージャー関数内でtrueを返した要素が配列として返される
  • コレクションは使用不可

使用例は以下の通りです。

使用例

1$array = [1, '1', 2, '2'];
2
3// 値が文字列であることをフィルタリングの条件としてクロージャーを指定
4Arr::where($array, function($value, $key) {
5    return is_string($value);
6});
7
8// 結果(文字列の要素のみがフィルタリングされる)
9array:2 [10  1 => "1"
11  3 => "2"
12]

フィルタリングの条件を指定するクロージャー関数は第二引数に指定します。

例でいうと下記の部分がフィルタリングを実施するクロージャー関数になります。

クロージャー関数部分抜粋

1function($value, $key) {
2  return is_string($value);
3}

配列の各要素毎に第二引数で指定したクロージャー関数が実行され、trueを返した要素のみがArr::whereの返り値として配列で返されます

また、クロージャー関数内では、配列の各要素の値とキーをそれぞれ受け取ることができ、値が第一引数キーが第二引数としてそれぞれクロージャー関数に渡されます。

第二引数のクロージャー関数について

  • 第二引数のクロージャー関数でフィルタリングの条件を指定する
  • クロージャー関数は配列の要素毎に実施されtrueを返した要素がArr::whereの返り値となる
  • クロージャー関数内では第一引数に要素の値、第二引数に要素のキーを受け取ることができる

全体の挙動としては、先程の例で説明すると、配列のフィルタリングの条件としてクロージャー関数内でreturn is_string($value)としており文字列の要素のみにフィルタリングをかけていることがわかります。

クロージャーは配列内の要素毎に実行されます。

例では1(数値)、1(文字列)、2(数値)、2(文字列)が配列の要素になるので、順番にクロージャー関数が下記のように実行されていきます。

クロージャー関数の実行イメージ

1
2// 1周目
3// $valueに1(数値)が格納されている
4function ($value, $key) {
5  // $valueは数値なのでfalseを返す
6  return is_string($value);
7}
8
9// 2周目
10// $valueに1(文字列)が格納されている
11function ($value, $key) {
12  // $valueは文字列なのでtrueを返す
13  return is_string($value);
14}
15
16// 3周目
17// $valueに2(数値)が格納されている
18function ($value, $key) {
19  // $valueは数値なのでfalseを返す
20  return is_string($value);
21}
22
23
24// 4周目
25// $valueに2(文字列)が格納されている
26function ($value, $key) {
27  // $valueは文字列なのでtrueを返す
28  return is_string($value);
29}

最終的にArr::whereの返り値としてクロージャー関数内でtrueを返した要素が返却されます。

例では2週目と4週目にtrueを返した、1(文字列)、2(文字列)が返されています

結果

1// 結果
2// 2、4週目の要素がtrueを返しているので返り値として返却される
3array:2 [4  1 => "1"
5  3 => "2"
6]

返り値のキーは例を見て分かる通りリセットされません

コレクションでは使用できずエラーになります。

コレクション(エラー)

1$collection = Collection::make([1, '1', 2, '2']);
2Arr::where($collection, function($value, $key) {
3    return is_string($value);
4});
5
6// エラー
7// array_filter(): Argument #1 ($array) must be of type array, Illuminate\Support\Collection given

Arr::whereNotNull 配列内からnull要素を削除

配列内からnull要素を削除します。

whereNotNull

Arr::whereNotNull(配列): 配列

  • 配列内のnull要素を削除

使用例

1$array = [null, 0, '', [], false];
2Arr::whereNotNull($array);
3
4// 結果(null要素が削除されている)
5array:4 [6  1 => 0
7  2 => ""
8  3 => []
9  4 => false
10]

上記の例では、nullが削除された配列が返ってきているのがわかります。

添字配列の場合、null削除後の配列はキーがリセットされません

Arr::wrap 指定した値を配列にラップ

指定した値を配列にラップします。

wrap

Arr::wrap(要素): 配列

  • 指定した値を配列にラップする
  • 引数にnullを指定した場合は空配列を返す
  • 引数に配列を指定した場合はラップしない

以下の例では指定した文字列配列として返されています

使用例

1$string = '1';
2Arr::wrap($string);
3
4// 結果
5array:1 [6  0 => "1"
7]

nullが指定された場合は空の配列が返されます。

nullを指定

1Arr::wrap(null);
2
3// 結果
4[]

また、配列を指定した場合はそのまま返されます

引数に配列を指定

1$array = ['1'];
2Arr::wrap($array);
3
4// 結果(引数に指定した配列がラップされることなくそのまま返される)
5array:1 [6  0 => "1"
7]

今回はtoCssClassesundotwherewhereNotNullwrapと5つのへルパ関数を紹介しました。

以下まとめになります。

まとめ

  • Arr::toCssClasses CSSのクラス文字を生成
  • Arr::undot ドット記法を用いた一次元配列を多次元配列に変換
  • Arr::where クロージャーを使用して配列要素をフィルタリング
  • Arr::whereNotNull 配列ないからnull要素を削除
  • Arr::wrap 指定した値を配列にラップ

配列のへルパ関数も残り5つになりました!次回の記事で最後まで紹介していきたいと思います!

本記事以外でも配列のへルパ関数の解説しているので下記からよければどうぞ!

.Dev.Record