【PHP】第一回 配列操作の関数を勉強しよう

f:id:arms-doi:20211102180512j:plainこんにちは!ドイです。

「こんな関数あったけど、なんだっけ」と調べることが多く、
全てを覚えられないにしろ、引き出しの数を多くしたいなあと思うこの頃です。

本日は、コードを書く上で不可避である、PHPの配列操作の関数について、学んでいきたいと思います!!

PHPマニュアルの配列操作の関数を調べますと。。

www.php.net

82の関数がありますね。 あまり知らないような関数もあり、見ているだけでも「こんな関数があるのか」と勉強になります。 これから数回に分けて、こちらの関数を上から順に紹介してきたいと思います。

こちらを上から見ていきます。 PHP: 配列 - Manual

多いですね。。

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は、どんな時に使うのでしょう。初期値を持たせたい時などに使えるのでしょうか。

今後数回に分けて配列操作の関数を勉強していくので、こんな時に使える関数があったはずだったな。。とすぐ使えるように頭の片隅に置いておきたいと思います。