我有以下代碼:爲什麼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_unique()
後,我這樣做:
var_dump(array_keys($myAwesomeArray));
然後將印刷標有在輸出int
類型:
array(4) {
[0]=> int(0)
[1]=> int(1)
[2]=> int(2)
[3]=> int(4)
}
這確實不匹配json_encode()
正在輸出。
我讀了所有我能找到array_unique()
和想不通爲什麼會這樣。
我使用PHP 5.3和PHP 5.6在Windows 7機器上測試了上面的代碼,在行爲/輸出上沒有區別。
這是一個錯誤?我應該這樣報告嗎?或者這是正常的行爲?
它去掉了第三個元素,因此PHP使它成爲一個對象,而不是一個簡單的數組。你可以通過'array_values'運行數組來重新索引它。 –
@CharlotteDunois是的,這就是我所做的,以獲得我想要的行爲,但它仍然可能是一個錯誤。也許我會看一看'array_unique()'的實際實現,看看發生了什麼,也許這是故意的行爲。 –
不,這不是一個錯誤。在PHP中,數組可以有任何你想要的鍵,在Javascript中,它們從0開始編號索引,因此你不能跳過任何數字索引(在你的例子中,'3'),因此你得到一個對象。 –