2017-02-17 8 views
1

私は、次のコードを持っている: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マシンでテストしました。

これはバグですか?私はそれをそのように報告すべきでしょうか?または、この正常な動作ですか?

+0

したがって、PHPがオブジェクトの代わりに、単純な配列になり、第三の要素を削除しました。 'array_values'を使って配列を実行して、それを再インデックスすることができます。 –

+0

@CharlotteDunoisはい、それは私が望む振る舞いを得るためにしたものですが、それでもバグかもしれません。たぶん、 'array_unique()'の実際の実装を見て、何が起こっているのかを見てみましょう。多分それは意図的な振る舞いです。 –

+0

いいえ、バグではありません。 PHP配列では、任意のキーを指定することができます.Javascriptでは、0から始まる数値索引を使用しています。したがって、number-index(例では '3')をスキップすることはできません。 –

答えて

2

の代替を取得する、キーは結果の配列が再索引付けされていない、残ります。

PHPに問題ありませんが、JavaScriptで配列が有する - 定義により - 0 - インデックス付き、シーケンシャルキー。

あなたのJSONを生成するときに、PHPは、キーが有効なJavaScript配列のキーではなく、オブジェクトへのあなたの配列を変換することを認識しています。これは正しいです。

あなたの結果、「期待」をしたい場合は、再インデックスあなたの配列を行う必要があります。

$z = json_encode(array('all' => array_values($myAwesomeArray))); 
           ^^^^^^^^^^^^ generate a new array with just the values 
+0

数字キーの場合は、キーが連続していないと本当に問題になりますか?この場合は無視できませんか? –

+1

@RaduMurzeaいいえ、できません。そのような目的で配列を作成したかもしれないので、PHPは単純にそれを無視できません。 –

+0

@RaduMurzeaまた、 'array_unique'はあなたのタイトルで言及したようにキーを文字列キーに変換しないことに注意してください。それはあなたが与えた情報で有効なjsonを生成する必要がある' json_encode'です。 – jeroen

0

使用ではなく、ラインのこの

$myAwesomeArray = array_keys(array_flip($myAwesomeArray)); 

$myAwesomeArray = array_unique($myAwesomeArray); 

これはあなたの要件ごとにあります。

これを試してください。これはうまくいくはずです。あなたがarray_uniqueを使用する場合

あなたはこのlink

関連する問題