2017-02-10 176 views
2

這裏是我的測試代碼:比較陣列不打印的差異

$a = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"21"); 

$b = array("Peter"=>"35", "Ben"=>"21", "Joe"=>"43"); 

function leo_array_diff($a, $b) { 
    $map = array(); 
    foreach($a as $val) $map[$val] = 1; 
    foreach($b as $val) unset($map[$val]); 
    return array_keys($map); 
} 

print_r(leo_array_diff($a, $b)); 

echo "<br>"; 

print_r(array_diff($a, $b)); 

這裏是它打印出:

Array ([0] => 37) 
Array ([Ben] => 37) 

我要去被提及leo_array_diff()功能:

第一個問題:

正如你所看到的,彼得是相同的數字,所以這很好。 $a ben和$b ben是不同的。 $a$b喬是不同的。但它只是表現出不同。

也許是因爲$a joe 21與$b相同ben是21?我該如何改變它?彼得需要與彼得相對應,本需要與本等對應...

第二個問題:

本是不同的,是的,因爲37和21,但在print_r,那隻能說明Array ([0] => 37) 。我如何讓它顯示Array ([0] => 21)?如何在調用函數時編輯函數並不交換參數?

+3

1)看看'和array_diff_assoc()'2)閱讀'和array_diff_assoc的文檔() 「你的論點順序很重要! – Rizier123

+0

@ Rizier123哇,這工作的第二線。那麼使用函數'leo_array_diff()'的第一行呢? – jasonmoqio

回答

2

首先,你對array_diff有誤解。

返回一個數組,其中包含array1中所有不存在於其他數組中的所有條目。

它沒有返回索引Joe,因爲值21在第一個數組中。

現在,爲什麼你的功能不工作?那麼讓我們一步一步來。

這裏是你的地圖看起來就像你第一次的foreach後:

array(
    '35' => '1', 
    '37' => '1', 
    '21' => '1' 
) 

然後,在你的第二個的foreach,你通過數組循環和刪除鍵的值相匹配的位置。所以基本上,你刪除索引35和索引21這就是爲什麼只剩下索引37。 這裏真正的問題是因爲你沒有檢查任何地方的名字

這裏是給你的函數替代:

function leo_array_diff($a, $b) { 

    $map = array(); 

    foreach($a as $name => $value){ 

     // The name is not found in the second array 
     // Or the value is different from the first array 
     if(!isset($b[$name]) || $b[$name] != $value) 
      $map[$value] = 1; 

    } 

    return array_keys($map); 

} 

var_dump是:

array(2) { 
    [0]=> 
     int(37) 
    [1]=> 
     int(21) 
} 
+1

你是天才!好的,我該如何返回第二個數組的值?例如:現在有了ur函數,我得到這個:'Array([0] => 37 [1] => 21)'。現在,我得到值37和21,因爲他們是不同的。我怎樣才能得到數組2的值?在這種情況下21和43? – jasonmoqio

+1

@jasonmoqio再次因爲我已經在你的問題我上面的評論說:**你參數的順序是非常重要的** – Rizier123

+0

@jasonmoqio如果你想周圍的其他方式,你必須扭轉參數的順序一樣rizier說! 。但是,如果你想,我可以改變函數返回一個子數組。 –

0

交換$ a和$ b

的print_r(leo_array_diff($ B $ A));

只交換數組...第一個參數用於顯示位置,因此使用該數組的值的差異。

+0

是的,我知道。請參閱編輯。如何在調用函數時編輯函數並不交換參數? – jasonmoqio