今回のtipsは軽ーいやつです。
問題のコード
explodeとarray_popを同時に使うとはどういうことか?
$day = array_pop(explode('/', '2022/05/11'));
というように記述すると
PHP Notice: Only variables should be passed by reference
というエラーが発生します
explode
筆者はこの単語を「爆発」という意味だと記憶しているが、php的には分割になる
explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
文字列の配列を返します。この配列の各要素は、
https://www.php.net/manual/ja/function.explode.phpstring
を文字列separator
で区切った部分文字列となります。
最初に書いたコードはどのような結果になるのかというと
explode('/', '2022/05/11') // => ['2022', '05', '11'] となる
年、月、日がそれぞれスラッシュによって区切られ、更に配列化される
array_pop
だいたい「pop」というワードが関数名に入っている場合、何かしらの最後が取れる(たぶん
array_pop(array &$array): mixed
array_pop() は配列 array の最後の要素の値を取り出して返します。 配列 array は、要素一つ分短くなります。
https://www.php.net/manual/ja/function.array-pop.php
最初に書いたコードだと。。
array_pop(explode('/', '2022/05/11')) // => array_pop(['2022', '05', '11']) => '11' という結果を推測していた
array_popの中身が処理された後に、配列の最後を返してくれるかと思いきや
エラーを返してきたとんでもない子
関数が含まれてるからダメなのか?マニュアルを見ても
配列以外を指定して呼び出した場合、この関数は E_WARNING レベルのエラーとなります。
https://www.php.net/manual/ja/function.array-pop.php
と書かれているので、エラーにならんくて良いんじゃないの?と思うが、、、
対策
単純に2行に分ければ問題なく動きます(当然
$arrYmd = explode('/', '2022/05/11'); // => ['2022', '05', '11']
$day = array_pop($arrYmd); // => '11'
欲張って1行にまとめすぎるのも良くないってことなんだと無理やり納得するしかないですね
では!