まめ畑

ゆるゆると書いていきます

PHP5.2.9についてのメモ

array_unique関数がPHP5.2.9から後方互換性を失いました - hnwの日記の記事を読んで自分の過去のコードを少し見たら、結構array_unique関数を使っていたのでメモと記事紹介。

2/26にPHP5.2.9がリリースされましたが、このバージョンからarray_unique関数が後方互換性を失いました。この関数を利用しているアプリケーションは、PHP5.2.9以降のバージョンでは新たなバグに悩まされるかもしれません。

http://d.hatena.ne.jp/hnw/20090228


と書かれていたので、自分の過去のコードを少しあさってみると思った以上に使っていた。
簡単にまとめると、array_uniqueに引数が追加されて、重複とみなす条件が変わったという事。
(しかし、配列の要素が整数または整数とみなせる文字列だけであれば問題ないとの事。)


重複とみなす条件は、記事にも詳細に書かれていますが、「strcmpで比較していたのを==で比較するようになった」との事。
SORT_REGULARが標準になりました。
SORT_REGULAR時の動作は記事を参照して下さい。
結構、面白い動作しますよ。。。


元の様な比較にしたい場合は、第2引数を指定すればいいのですが、そうすると5.2.8以前のコードでは第2引数が無いので動かないですね。
PHPのバージョンでを判別して使う関数を分けるしかなさそうです。
本当にマイナーアップでこの仕打ちですか。ありがとうございます。


Ubuntuのパッケージで入れたPHPのバージョンで判別する簡単な方法。

<?php
$v = explode("-", PHP_VERSION);
//もしくは$v = explode("-", phpversion());

$uni = array();
$array = array("hoge", "hoge", "piyo");

if($v[0] < "5.2.9"){
   //昔ながらのやつ
   $uni = array_unique($array);
}else{
   $uni = array_unique($array, SORT_STRING);
}
?>

Ubuntuパッケージで入れたPHPで無ければ、explodeいらないです。


SORT_REGULARになる利点もあるわけですが、マイナーアップで後方互換がなくなるのはいただけないです。
でも、この関数って意外と使ってる人少ないのかな?


自分で書けばバージョンで振り分けいらないっすね。
でも、PHPのバージョンあげて動作変わったーとなる物は多そうな気はします。
PHPのキャストについてはよく知っておかないといけないと改めて感じました。