array_diff不适用于PHP

时间:2012-10-09 05:22:38

标签: php

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 ( [0] => Array ( [id] => 8 ))

我试过

array_diff($allmodels,$existmodels);array_diff_assoc($allmodels,$existmodels);都会产生

  

Array()

有谁能告诉我怎么能完成它?

3 个答案:

答案 0 :(得分: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)));

或将它们设置为键,很容易区分:

$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));

答案 1 :(得分:2)

array_diff注意事项:

  

当且仅当(字符串)$ elem1 ===时,才认为两个元素相等   (字符串)$ elem2。用文字表示:当字符串表示相同时。

数组的字符串表示形式都是Array,所以这就是为什么你得到空数组的原因。

您可以改用array_filter

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

答案 2 :(得分: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));