Php 查找ndimensional数组的n级中存在的值,而不是其他ndimensional数组中存在的值?

Php 查找ndimensional数组的n级中存在的值,而不是其他ndimensional数组中存在的值?,php,arrays,multidimensional-array,array-difference,Php,Arrays,Multidimensional Array,Array Difference,我有两个数组,它们看起来都像 array( array('key_id' => 1, 'value' => 4, 'whatever' => 'something'), array('key_id' => 2, 'value' => 3, 'whatever' => 'something'), array('key_id' => 3, 'value' => 2, 'whatever' => 'something'), arra

我有两个数组,它们看起来都像

array(
  array('key_id' => 1, 'value' => 4, 'whatever' => 'something'),
  array('key_id' => 2, 'value' => 3, 'whatever' => 'something'),
  array('key_id' => 3, 'value' => 2, 'whatever' => 'something'),
  array('key_id' => 4, 'value' => 1, 'whatever' => 'something'),
);
它们将有一些相交的
键id
,一些存在于第一个数组中,但不存在于第二个数组中,还有一些存在于第二个数组中,但不存在于第一个数组中

我想得到第一个数组中所有key_id的数组,但不是第二个数组。例如

$a = array(
  array('key_id' => 1, 'value' => 4, 'whatever' => 'something'),
  array('key_id' => 2, 'value' => 3, 'whatever' => 'something'),
  array('key_id' => 3, 'value' => 2, 'whatever' => 'something'),
);

$b = array(
  array('key_id' => 3, 'value' => 2, 'whatever' => 'something'),
  array('key_id' => 4, 'value' => 1, 'whatever' => 'something'),
);
我想要的输出是
array(1,2)

我目前的方法是:

$keys = array('orig' => array(), 'new' => array());

array_map(function($array){
  $keys['orig'][] = $array['key_id'];
}, $a);

array_map(function ($array) {
  $keys['new'][] = $array['key_id'];
}, $b);

$difference = array_diff($keys['orig'], $keys['new']);
哪种方法应该有效,但我想知道是否有更好的方法


这里使用的是一个工作示例,说明我正在做什么来为问题提供上下文:

<?php
$a = array(
  array('key_id' => 1, 'value' => 4, 'whatever' => 'something'),
  array('key_id' => 2, 'value' => 3, 'whatever' => 'something'),
  array('key_id' => 3, 'value' => 'o', 'whatever' => 'something'),
  array('key_id' => 5, 'value' => 'e', 'whatever' => 'something')
);

$b = array(
  array('key_id' => 3, 'value' => 'n', 'whatever' => 'something'),
  array('key_id' => 4, 'value' => 1, 'whatever' => 'something'),
  array('key_id' => 5, 'value' => 'e', 'whatever' => 'something')
));

function compareKeyId($a, $b) {
  if ($a['key_id'] === $b['key_id']) return 0;
  return ($a['key_id'] > $b['key_id']) ? 1 : -1;
}

function compareKeyIdAndValue($a, $b) {
    return ($a['key_id'] === $b['key_id'] && $a['value'] === $b['value']) ? 0 : -1;
  }

$changed = array();

$removed = array_udiff($a, $b, 'compareKeyId');
$added = array_udiff($b, $a, 'compareKeyId');

//get the elements that are present in both arrays (remainder)
$r = array();
$r['new'] = array_udiff($b, $removed, $added, 'compareKeyId');
$r['old'] = array_udiff($a, $removed, $added, 'compareKeyId');

$changed = array();
$changed['old'] = array_udiff($r['old'], $r['new'], 'compareKeyIdAndValue');
$changed['new'] = array_udiff($r['new'], $r['old'], 'compareKeyIdAndValue');

die('<pre>'.print_r(array('removed' => $removed, 'added' => $added, 'changed' => $changed), true).'</pre>');
?>
怎么样

$a = array(
array('key_id' => 1, 'value' => 4, 'whatever' => 'something'),
array('key_id' => 2, 'value' => 3, 'whatever' => 'something'),
array('key_id' => 3, 'value' => 2, 'whatever' => 'something'),
);

$b = array(
array('key_id' => 3, 'value' => 2, 'whatever' => 'something'),
array('key_id' => 4, 'value' => 1, 'whatever' => 'something'),
);

$a1 = array_values($a);
$b1 = array_values($b);
for($i=0;$i<=count(a1);$i++){
   if( $a1[$i]['key_id'] != $b1[Si]['key_id'] ){
      $res[]=$a1[$i]['key_id'];
   }
}
print_r( $res );
这样做的更好之处在于,它首先过滤元素,然后仅在需要时并且仅为已过滤的元素创建仅键数组。否则,它本质上是一样的,也许以一种更干净的方式

我可能会将其包装在一个类中,该类将在构造函数中获取列id,并将上述函数作为方法,使用私有变量中的列id。

工作正常:

$a=数组(
数组('key_id'=>1,'value'=>4,'whatever'=>something'),
数组('key_id'=>2,'value'=>3,'whatever'=>something'),
数组('key_id'=>3,'value'=>2,'whatever'=>something'),
);
$b=数组(
数组('key_id'=>3,'value'=>2,'whatever'=>something'),
数组('key_id'=>4,'value'=>1,'whatever'=>something'),
);
$a1=数组_值($a);
$b1=数组_值($b);

对于($i=0;$iAh-yes,这将起作用,它还需要
array\u-walk($difference,function(&$a){$a=$a['key\u-id'];})
的最后一行($a=$a['key\u-id']});
也给出上述输出。@Hailwood-yes,补充道:)干杯,如果你感兴趣,我已经添加了一个例子,说明我在这个问题中使用它的目的;)
$a = array(
array('key_id' => 1, 'value' => 4, 'whatever' => 'something'),
array('key_id' => 2, 'value' => 3, 'whatever' => 'something'),
array('key_id' => 3, 'value' => 2, 'whatever' => 'something'),
);

$b = array(
array('key_id' => 3, 'value' => 2, 'whatever' => 'something'),
array('key_id' => 4, 'value' => 1, 'whatever' => 'something'),
);

$a1 = array_values($a);
$b1 = array_values($b);
for($i=0;$i<=count(a1);$i++){
   if( $a1[$i]['key_id'] != $b1[Si]['key_id'] ){
      $res[]=$a1[$i]['key_id'];
   }
}
print_r( $res );