array_diff
http://jp2.php.net/manual/ja/function.array-diff.php
> 二つの要素は、(string) $elem1 === (string) $elem2 の場合のみ等しいと*見直されます*。言い換えると、文字列表現が同じ場合となります。
みなされます、の間違いか。
なんか結果を見ると、nullと空文字列が変だなあと思って確認するべく書いてみた。
<?php $arr1 = array( 'a'=>null, 'b'=>'', 'c'=>0 ); echo "\$arr1 = array( 'a'=>null, 'b'=>'', 'c'=>0 )"; echo '<br>dump:'; var_dump($arr1); echo '<hr>'; $arr2 = array( null ); echo "\$arr2 = array( null )"; echo '<br>dump:'; var_dump($arr2); echo '<hr>'; $arr3 = array( '' ); echo "\$arr3 = array( '' )"; echo '<br>dump:'; var_dump($arr3); echo '<hr>'; echo 'array_diff( $arr1, $arr2)'; echo '<br>dump:'; var_dump( array_diff( $arr1, $arr2)); echo '<br>'; echo '<br>'; echo 'array_diff( $arr1, $arr3)'; echo '<br>dump:'; var_dump( array_diff( $arr1, $arr3));
出力:
$arr1 = array( 'a'=>null, 'b'=>'', 'c'=>0 ) dump:array(3) { ["a"]=> NULL ["b"]=> string(0) "" ["c"]=> int(0) } $arr2 = array( null ) dump:array(1) { [0]=> NULL } $arr3 = array( '' ) dump:array(1) { [0]=> string(0) "" } array_diff( $arr1, $arr2) dump:array(1) { ["c"]=> int(0) } array_diff( $arr1, $arr3) dump:array(1) { ["c"]=> int(0) }
で、よくよく見ると
(string) $elem1 === (string) $elem2 の場合のみ等しい
とあり、stringにキャストされていることを知った。
気もちわるうい。