2017-02-17 80 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_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機器上測試了上面的代碼,在行爲/輸出上沒有區別。

這是一個錯誤?我應該這樣報告嗎?或者這是正常的行爲?

+0

它去掉了第三個元素,因此PHP使它成爲一個對象,而不是一個簡單的數組。你可以通過'array_values'運行數組來重新索引它。 –

+0

@CharlotteDunois是的,這就是我所做的,以獲得我想要的行爲,但它仍然可能是一個錯誤。也許我會看一看'array_unique()'的實際實現,看看發生了什麼,也許這是故意的行爲。 –

+0

不,這不是一個錯誤。在PHP中,數組可以有任何你想要的鍵,在Javascript中,它們從0開始編號索引,因此你不能跳過任何數字索引(在你的例子中,'3'),因此你得到一個對象。 –

回答

2

替代當您使用array_unique,按鍵會保持,結果數組是不是重新建立索引。

這是沒有問題的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_encode',它需要用你提供的信息生成有效的json。 – jeroen

0

使用此

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

,而不是線

$myAwesomeArray = array_unique($myAwesomeArray); 

這是按照您的要求。

試試看,這應該有效。

您將獲得本link

相關問題