こんにちは!ドイです。
「こんな関数あったけど、なんだっけ」と調べることが多く、
全てを覚えられないにしろ、引き出しの数を多くしたいなあと思うこの頃です。
本日は、コードを書く上で不可避である、PHPの配列操作の関数について、学んでいきたいと思います!!
PHPマニュアルの配列操作の関数を調べますと。。
82の関数がありますね。 あまり知らないような関数もあり、見ているだけでも「こんな関数があるのか」と勉強になります。 これから数回に分けて、こちらの関数を上から順に紹介してきたいと思います。
こちらを上から見ていきます。 PHP: 配列 - Manual
多いですね。。
- array_change_key_case
- array_chunk
- array_column
- array_combine
- array_count_values
- array_diff_assoc
- array_diff_key
- array_diff_uassoc
- array_diff_ukey
- array_diff
- array_fill_keys
- array_filter
- まとめ
array_change_key_case
配列のキーを小文字、あるいは大文字にして返します。
// 小文字にする <?php $array = ['APPLE' => 'apple', 'BANANA' => 'banana', 'COOKIE' =>'cookie']; $change = array_change_key_case($array); echo $change;
// 出力 <?php array:3 [▼ "apple" => "apple" "banana" => "banana" "cookie" => "cookie" ]
大文字で'APPLE' 'BANANA' 'COOKIE'となっていた部分が、小文字に変換されたのがわかるかと思います。
大文字にする
// 第二引数に「CASE_UPPER」を指定 <?php $array = ['apple' => 'apple', 'banana' => 'banana', 'cookie' =>'cookie']; $change = array_change_key_case($array, CASE_UPPER); echo $change;
下記のように出力されます。 小文字で'apple' 'banana' 'cookie'となっていた部分が、大文字に変換されたのがわかるかと思います。
// 出力 <?php array:3 [▼ "APPLE" => "apple" "BANANA" => "banana" "COOKIE" => "cookie" ]
array_chunk
配列を分裂します。
<?php $array = ['apple', 'banana', 'cookie', 'rice', 'chocolate', 'ramen', 'sushi']; $change = array_chunk($array, 2); echo $array;
// 出力 <?php array:4 [▼ 0 => array:2 [▼ 0 => "apple" 1 => "banana" ] 1 => array:2 [▼ 0 => "cookie" 1 => "rice" ] 2 => array:2 [▼ 0 => "chocolate" 1 => "ramen" ] 3 => array:1 [▼ 0 => "sushi" ] ]
配列を指定した数字で分割することができました。
元の配列のキーを維持したい場合は、 第三引数に「true」を指定します。
// <?php $array = ['apple', 'banana', 'cookie', 'rice', 'chocolate', 'ramen', 'sushi']; $change = array_chunk($array, 2, true); echo $array;
// 出力 <?php array:4 [▼ 0 => array:2 [▼ 0 => "apple" 1 => "banana" ] 1 => array:2 [▼ 2 => "cookie" 3 => "rice" ] 2 => array:2 [▼ 4 => "chocolate" 5 => "ramen" ] 3 => array:1 [▼ 6 => "sushi" ] ]
「true」を指定した場合と、指定しない場合(デフォルトはfalseです) それぞれキーが異なります。
array_column
配列の中から、指定したカラムを返す。
DBから返ってきたデータを扱うときに、すごく便利ですね。
<?php $array = [ 0 => ['food' => 'sushi', 'color' => 'pink', 'animal' => 'cat'], 1 => ['food' => 'ramen', 'color' => 'red', 'animal' => 'cat'], 2 => ['food' => 'cookie', 'color' => 'blue', 'animal' => 'cat'], 3 => ['food' => 'takoyaki', 'color' => 'yellow', 'animal' => 'cat'], ]; echo array_column($array, 'color');
// 出力 <?php array:4 [▼ 0 => "pink" 1 => "red" 2 => "blue" 3 => "yellow" ]
array_combine
第一引数に指定した配列をキー、第二引数に指定した配列を値として返します。
<?php $color = ['yellow', 'red', 'blue']; $food = ['banana', 'chanja', 'chocolate mint']; echo array_combine($color, $food);
// 出力 <?php array:3 [▼ "yellow" => "banana" "red" => "chanja" "blue" => "chocolate mint" ];
配列の中身の数が一致しない場合、エラーが発生します。
array_count_values
配列内の同じ値の数をカウントし、値 => 数の形式で返します。
<?php $array = ['cat', 'cat', 'bear', 'cat', 'pig', 'pig']; echo array_count_values($array);
// 出力 <?php array:3 [▼ "cat" => 3 "bear" => 1 "pig" => 2 ];
array_diff_assoc
配列を比較して、配列に含まれないものを配列にして返します。
DBから帰ってきた値と、取得した値を比較して、被ってないものだけ返す
といった処理に使えます。
下記で紹介する、array_diff()と違い、配列のキーまで含めて比較。
<?php $array1 = ['0' => 'apple', '1' => 0, 'a' => 'cherry']; $array2 = ['0' => 'apple', '1' => '00', '2' => 'cherry']; echo array_diff_assoc($array1, $array2);
// 出力 <?php array:2 [▼ 1 => 0 "a" => "cherry" ];
array_diff_key
配列のキーを比較して、差分を返します。
// 出力 <?php $array1 = ['name' => 1, 'address' => 2, 'birthday' => 3, 'number' => 4]; $array2 = ['name' => 5, 'car' => 6, 'home' => 7, 'birthday' => 8]; echo array_diff_key($array1, $array2);
// 出力 <?php array:2 [▼ "address" => 2 "number" => 4 ]
array_diff_uassoc
配列のキーを比較して、差分を返します。
<?php $array1 = ["id" => "000001", "gender" => "men", "birthday" => "1991/10/09", "food" => "chocolate", "hobby" => "reading"]; $array2 = ["id" => "000001", "gender" => "men", "anniversary" => "1991/10/09", "drink" => "beer", "sports" => "soccer"]; $data = array_diff_uassoc($array1, $array2, function ($a, $b) { if ($a === $b) { return 0; } return ($a > $b) ? 1 : -1; }); echo $data;
<?php array ( 'birthday' => '1991/10/09', 'food' => 'chocolate', 'hobby' => 'reading', )
配列のvalue値でなく、キーを比較するため、例えば"1991/10/09"という値は一致していますが、 キーは"birthday"と"anniversary"なので、配列の差としてみなされます。
この次に紹介するarray_diff_ukeyとの違いがわからなかったのですが、例えば上記の配列の順番を入れ替えるとわかるかと思います。
<?php $array1 = ["gender" => "000001", "id" => "men", "birthday" => "1991/10/09", "food" => "chocolate", "hobby" => "reading"]; $array2 = ["id" => "000001", "gender" => "men", "anniversary" => "1991/10/09", "drink" => "beer", "sports" => "soccer"]; $data = array_diff_uassoc($array1, $array2, function ($a, $b) { if ($a === $b) { return 0; } return ($a > $b) ? 1 : -1; }); echo $data;
<?php array ( 'gender' => '000001', 'id' => 'men', 'birthday' => '1991/10/09', 'food' => 'chocolate', 'hobby' => 'reading', )
上記ではidとgenderは差として見なされませんでしたが、順を変えることによって、差としてみなされたようです。
PHPマニュアルにも説明があるかと思いますが、追加された添字の確認を含めて配列の差を計算するようです。
array_diff_ukey
上記で説明したarray_diff_uassocと似ているのですが、こちらは配列の差を返しますが、添字の確認はしてくれません。
<?php $array1 = ["gender" => "000001", "id" => "men", "birthday" => "1991/10/09", "food" => "chocolate", "hobby" => "reading"]; $array2 = ["id" => "000001", "gender" => "men", "anniversary" => "1991/10/09", "drink" => "beer", "sports" => "soccer"]; $data = array_diff_ukey($array1, $array2, function ($a, $b) { if ($a === $b) { return 0; } return ($a > $b) ? 1 : -1; }); echo $data;
array_diff
上記で紹介した、array_diff_uassocとarray_diff_ukeyと似ていますが、上記はコールバック関数でかつキーを比較していましたが、こちらはキーでなく値を比較してくれます。
<?pho $array1 = [0 => "Mercury", 1 => "Venus", 2 => "Earth", 3 => "Mars", 4 => "Jupiter"]; $array2 = [0 => "Mercury", 1 => "Saturn", 2 => "Uranus", 3 => "Neptune", 4 => "Pluto"]; echo array_diff($array1, $array2);
<?php array ( 1 => 'Venus', 2 => 'Earth', 3 => 'Mars', 4 => 'Jupiter', )
array_fill_keys
キーを宣言して、配列の値をうめます。
<?php $array1 = ["id","number","birthday",]; echo array_fill_keys(array1, 0);
<?php array ( 'id' => 0, 'number' => 0, 'birthday' => 0, )
array_filter
コールバックを使用して、配列の要素をフィルタリングします。
<?php $array1 = [1,2,3,4,5,6,7,8,9]; array_filter($array1, function ($array1) { return $array1 & 1; });
<?php array ( 0 => 1, 2 => 3, 4 => 5, 6 => 7, 8 => 9, )
コールバック関数ってどうも苦手だったのですが、書いてみるとそこまで違和感なく使えますね。よかったです 。。
まとめ
「こんな関数何に使うのだろう」と思うことも多いのですが、使う場面を想像して調べて、手を動かすのも勉強になりますね。 例えばarray_fill_keysは、どんな時に使うのでしょう。初期値を持たせたい時などに使えるのでしょうか。
今後数回に分けて配列操作の関数を勉強していくので、こんな時に使える関数があったはずだったな。。とすぐ使えるように頭の片隅に置いておきたいと思います。