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

私は試した

array_diff($allmodels,$existmodels);ANDarray_diff_assoc($allmodels,$existmodels);両方の結果

配列 ( )

誰かがどうすればそれを成し遂げることができるか教えてもらえますか?

4

3 に答える 3

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));
于 2012-10-09T05:33:10.773 に答える
2

array_diffのメモ:

(string)$ elem1 ===(string)$ elem2の場合に限り、2つの要素は等しいと見なされます。つまり、文字列表現が同じ場合。

配列の文字列表現は両方Arrayであるため、結果として空の配列を取得するのはこのためです。

代わりにarray_filterを使用できます。

var_dump(array_filter($allmodels, function ($var) use ($existmodels) {
  return !in_array($var, $existmodels);
}));
于 2012-10-09T05:36:06.900 に答える
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));
于 2012-10-09T05:36:23.557 に答える