php 5.2.9 で array_unique() のデフォルトの挙動が変更
PHP 5.2.9 がリリースされましたが、少し気になったのでメモしておきます。
array_unique() の挙動が変更されています。array_unique() に第2引数(sort_flag)が追加され、ソート方法が指定できるようになりました。
以下のようにデフォルトが SORT_REGULAR になっていますので、これまでのバージョンとは挙動が変わります。
Added optional sorting type flag parameter to array_unique(). Default is SORT_REGULAR. (Andrei)
PHP 5.2.9 Release Announcement
配列に複数の型が存在する、または、配列にオブジェクトが存在する場合、意図しない結果になる場合があります。
前バージョンとの互換性を保つには、第2引数に SORT_STRING を指定する必要があります。
id:moriyoshi さんが問題となるコードを以下で示しておられます。
上記で以下のようなコードが示されていますが、この結果は予想できない気がします。
<?php $objs = array( "0x1", "1", ); var_dump(array_unique($objs, SORT_REGULAR)); var_dump(array_unique($objs, SORT_STRING));
結果:
array(1) { [0]=> string(3) "0x1" } array(2) { [0]=> string(3) "0x1" [1]=> string(1) "1" }
他にも、以下のコードの場合、SORT_REGULAR では順番によって結果が変わるなど、結果が安定しません。
<?php $input = array( 1, '1a', '1' ); // $input = array( 1, '1', '1a' ); var_dump( array_unique( $input, SORT_REGULAR ) ); var_dump( array_unique( $input, SORT_STRING ) );
結果:
array(2) { [0]=> int(1) [2]=> string(1) "1" } array(2) { [0]=> int(1) [1]=> string(2) "1a" }