2016-12-09 101 views
0

對於一個項目,我發現我必須開始使用數組相交。 http://php.net/manual/en/function.array-intersect.phpPHP Array key name

在那裏,我發現這個代碼,這也解釋了函數的功能:

<?php 
$array1 = array("a" => "green", "red", "blue"); 
$array2 = array("b" => "green", "yellow", "red"); 
$result = array_intersect($array1, $array2); 
print_r($result); 
?> 

輸出是什麼讓我困惑。

(
    [a] => green 
    [0] => red 
) 

什麼a0意味着在這種情況下?

它不應該是0 1爲什麼它有一個開始,然後變爲0

+0

你已經鏈接到您問題的答案:*「array_intersect()返回一個包含數組所有參數中存在的array1的所有值**請注意,鍵將被保留**「* – Rizier123

+0

什麼令你困惑的是,它們不是」數組「 - 它們是*字典*。 $ array1是[a =>綠色,0 =>紅色,1 =>藍色],有兩個數字自動鍵和一個文本鍵。在這種情況下使用array_intersect *是可能的,但是...恕我直言,**要小心避免**。 – LSerni

+0

輸出是'$ array1'中存在於'$ array2'中的所有值。發現「綠色」和「紅色」,所以'$ array1'中的那些鍵被保留,其他值被丟棄。 –

回答

3
$array1 = array("a" => "green", "red", "blue"); 
$array2 = array("b" => "green", "yellow", "red"); 
$result = array_intersect($array1, $array2); 

首先,我們必須寫出這些字典,因爲它們是真的;上面的表格是「濃縮的」,帶有隱含的數字鍵。

$array1 is a: green, 0: red, 1: blue 
$array2 is b: green, 0: yellow, 1: red 

現在array_intersect檢查什麼是常見的。他們是綠色的,紅色的。在array1相應項目採取:

a: green 
0: red 

,所以你有兩個鍵,「a」和0,分別映射到綠色和紅色。

在這一點上,我會補充說,混合數字和非數字鍵是災難的配方,除非你非常小心你在做什麼;許多PHP函數不會保留鍵並將字典的值重新編號爲數組。

正如你所看到的,它不是直接告訴字典中的數組。爲了增加風險,JSON編碼對於這兩者來說是完全不同的,所以結構中的細微變化可能會使Web服務對話突然崩潰。

JSON

這是我最喜歡的客廳把戲。

$arr = array('Hello', 'World'); 

這JSON-編碼,如你所願,到:

[ 'Hello', 'World' ] 

比方說,我刪除最後一個元素,並重新JSON:

[ 'Hello' ] 

但是,讓我們說,我刪除一個元素這不是最後的。 PHP做什麼?它刪除元素和密鑰,但不重新編號數組。該陣列現在有一個。而陣列沒有漏洞 - 字典做。

所以這現在是一個字典。而在JSON它突然變:

{ "1": "World" } 

這意味着這個示例代碼巧妙地竊聽

$arr = functionReturningArrayOfElements(); 

if (-1 != $killThisElement) { 
    unset($arr[$killThisElement]); 
} 

header('Content-Type: application/json'); 
die(json_encode($arr)); 

$killThisElement是最後的條目($計數($ ARR)-1) ,那麼JSON將被編碼爲一個數組。否則,它將被編碼爲字典。

之前回來,我要肯定的是我回:

$arr = array_values($arr); // This renumbers the keys, forcing it to always be an array 

$arr['count'] = count($arr); 
// This adds a non-numeric key, forcing $arr to always be a dictionary. 
// The extra key is called 'count' just so it makes sense, but it is also 
// a BAD IDEA, since it encourages to loop through the object instead of 
// using the proper Javascript Object methods. A better choice from this 
// point of view would be 
$arr['comment'] = 'This is a dictionary.'; 
+0

真棒,謝謝您的幫助我出來 –

+0

也有幫助知道,因爲我將使用這與json編碼 –

+1

我已經添加了一些JSON的考慮,你可能會覺得有用。 – LSerni

0

爲了表示$array1建成這個樣子。

$array1 = array("a" => "green", 0 => "red", 1 => "blue"); 

使array_intersect保持密鑰的事實這兩個密鑰:與值成對的維持

"a" => "green", 0 => "red" 
1
  • array_intersect()函數的兩個(或更多)陣列的值進行比較,並返回比賽。

  • 此功能的兩個或更多個陣列的值進行比較,並返回包含從array1存在於array2array3條目的陣列,等等

所以你的情況,該數組的元素有和沒有鍵,所以如果我們比較數組,我們發現$array2具有​​和red元素,它們出現在$array1中,所以如果使用print_r()打印數組,它會將數組與自定義&保存的密鑰(在沒有分配密鑰的情況下保存)。

查看更多有關array_intersect()

所以,如果你嘗試打印$array1,它會像:

array:3 [ 
    "b" => "green" 
    0 => "yellow" 
    1 => "red" 
] 

希望這有助於!