explodeとarray_popは同時に使えない

PHP

今回の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

文字列の配列を返します。この配列の各要素は、 string を文字列 separator で区切った部分文字列となります。

https://www.php.net/manual/ja/function.explode.php

最初に書いたコードはどのような結果になるのかというと

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行にまとめすぎるのも良くないってことなんだと無理やり納得するしかないですね

では!