t_komuraの日記

2009-02-28

[] php 5.2.9 で array_unique() のデフォルトの挙動が変更 17:12  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"
}