2012-10-09 33 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