2012-10-09 79 views
3
Array 1 ($allmodels) 
Array ([0] => Array ([id] => 6) 
     [1] => Array ([id] => 7) 
     [2] => Array ([id] => 8)) 

Array 2 ($existmodels) 
Array ([0] => Array ([id] => 6) 
     [1] => Array ([id] => 4) 
     [2] => Array ([id] => 7) 
     [3] => Array ([id] => 5)) 

我想要什麼作爲輸出數組(使用$ allmodels獲得剩餘的車型 - $ existmodels)和array_diff不起作用PHP

Array ([0] => Array ([id] => 8)) 

我試圖

array_diff($allmodels,$existmodels);array_diff_assoc($allmodels,$existmodels);這兩個結果

Array()

有誰能告訴我如何完成它?

+0

嘗試切換陣列的順序?首先是$ existmodels。 –

+0

必須這樣做。當我的db增長時,所有模型都會變得更大陣列 – Techie

+1

@JonStirling這不是問題。問題是'array_diff()'將元素轉換爲字符串進行比較。由於OP具有多維數組,因此每個元素都會轉換爲'Array',無論如何,函數都會返回一個空數組。 – NullUserException

回答

2

注:

兩個元素被認爲是相等的當且僅當(字符串)$ elem1 === (字符串)$ elem2。用詞表示:當字符串表示是相同的。

數組的字符串表示形式都是Array,所以這就是爲什麼你得到空數組作爲結果的原因。您可以改用array_filter

var_dump(array_filter($allmodels, function ($var) use ($existmodels) { 
    return !in_array($var, $existmodels); 
})); 
2

array_diff不適用於多維數組。你必須要麼解開和重新包裝你的ID:

$diff = array_map(function ($i) { return array('id' => $i); }, 
        array_diff(array_map(function ($i) { return $i['id']; }, $array1), 
          array_map(function ($i) { return $i['id']; }, $array2))); 

或將它們作爲鍵,這很容易顯示差異:和array_diff的

$diff = array_diff_key(array_combine(array_map(function ($i) { return $i['id']; }, $array1), $array1), 
         array_combine(array_map(function ($i) { return $i['id']; }, $array2), $array2)); 
+0

返回警告:array_combine()[function.array-combine]:兩個參數應該有相同數量的元素 – Techie

+0

Oooooops,typo 。 – deceze

+0

現在可以使用。謝謝 – Techie

1

試試這個

$array1 = array(0 =>array('id'=>1), 1=> array('id'=>2)); 
$array2 = array(0 =>array('id'=>3), 1=> array('id'=>2)); 
$diff = array(); 

foreach($array1 as $value1) 
{ 

    foreach($array2 as $value2) 
    { 
    if($value1['id'] == $value2['id']) 
    continue 2; 
    } 

    $diff[] = $value1; 
} 
echo nl2br(print_r($diff,1)); 
+0

我第一次在這裏學習了nl2br函數。順便說一句,感謝代碼片段 – Techie