私は、次のコードを持っている:array_uniqueが整数キーを文字列キーに変更するのはなぜですか?
$myAwesomeArray = array(
'value1',
'value2',
'value3',
'value3',
'value4',
'value4'
);
$z = json_encode(array('all' => $myAwesomeArray));
var_dump('before', $z);
$myAwesomeArray = array_unique($myAwesomeArray);
$z = json_encode(array('all' => $myAwesomeArray));
var_dump('after', $z);
ので、いくつかの重複する値が含まれている暗黙的に整数キーをインデックスとする配列があります。値が重複していることが重要です。そうでない場合は、以下で説明する動作が発生しません。
あなたが見ることができるように、私はJSONでアレイとarray_unique()
機能を通過させることの結果の両方を変換します。
私が見ることを期待出力のようなものです:私は、代わりにこの参照しかし
string(6) "before"
string(63) "{"all":["value1","value2","value3","value3","value4","value4"]}"
string(5) "after"
string(45) "{"all":["value1","value2","value3","value4"]}"
:
string(6) "before"
string(63) "{"all":["value1","value2","value3","value3","value4","value4"]}"
string(5) "after"
string(61) "{"all":{"0":"value1","1":"value2","2":"value3","4":"value4"}}"
を明らかに機能が実際に重複する値を削除しないが、それはからのキーを変更します少なくとも文字列の整数は、json_encode()
に表示されます。
array(4) {
[0]=> int(0)
[1]=> int(1)
[2]=> int(2)
[3]=> int(4)
}
行います。その後、
var_dump(array_keys($myAwesomeArray));
出力の種類int
でマークされている印刷:
もう一つの奇妙な挙動は、array_unique()
を通じて配列を通過した後、私はこれを行う場合ということですjson_encode()
が出力しているものと一致しません。
私はおよそarray_unique()
見つけることができると、これがなぜ起こるかを把握することはできません、すべてをお読みください。
私は上記のコードを動作/出力の違いなくPHP 5.3とPHP 5.6を使用してWindows 7マシンでテストしました。
これはバグですか?私はそれをそのように報告すべきでしょうか?または、この正常な動作ですか?
したがって、PHPがオブジェクトの代わりに、単純な配列になり、第三の要素を削除しました。 'array_values'を使って配列を実行して、それを再インデックスすることができます。 –
@CharlotteDunoisはい、それは私が望む振る舞いを得るためにしたものですが、それでもバグかもしれません。たぶん、 'array_unique()'の実際の実装を見て、何が起こっているのかを見てみましょう。多分それは意図的な振る舞いです。 –
いいえ、バグではありません。 PHP配列では、任意のキーを指定することができます.Javascriptでは、0から始まる数値索引を使用しています。したがって、number-index(例では '3')をスキップすることはできません。 –