hnwの日記

array_unique関数がPHP5.2.10から後方互換性を取り戻します

array_unique関数がPHP5.2.9から後方互換性を失いました」の内容について、PHPの中の人も認識を改めたようです。次のようなタレコミがありました。

【速報】「sort()関数は相当おかしい」と PHP 開発者を訴えていた問題で、原告の hnw さんが最高裁で勝訴の模様 http://news.php.net/php.internals/43980


http://wassr.jp/user/moriyoshi/statuses/e04jq6Xu3o


id:moriyoshiさんの地道な働きかけのおかげだと思います。ありがとうございます。


そんなわけで、array_uniqueの第2引数のデフォルト値をSORT_STRINGにする(=5.2.8以前の挙動に合わせる)ことで落ち着いたようです。先ほどsnapshotを取って来たところ、5.2系も5.3系も直っていました。


また、PHP 5.2.9の挙動を今後のバージョンに合わせたい場合はext/standard/array.cに下記のパッチを当てればOKです。

--- php-5.2.9/ext/standard/array.c.orig 2009-05-16 19:35:23.000000000 +0900
+++ php-5.2.9/ext/standard/array.c      2009-05-16 19:35:36.000000000 +0900
@@ -2839,7 +2839,7 @@
        };
        struct bucketindex *arTmp, *cmpdata, *lastkept;
        unsigned int i;
-       long sort_type = SORT_REGULAR;
+       long sort_type = SORT_STRING;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|l", &array, &sort_type) == FAILURE) {
                return;