我有两个数组,它们看起来都像
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'),
);
它们会有一些相交的key_id
,第一个数组中会出现一些,但第二个数据中不存在,第二个中存在一些但第一个不存在。
我想得到第一个数组中所有key_id的数组,但不是第二个数组。 E.g。
$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']);
哪个应该有用,但我想知道是否有更好的方法?
<小时/> 使用eis的method below这是我正在做的事情的一个工作示例,用于提供问题的背景:
<?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>');
?>
答案 0 :(得分:1)
怎么样
// get the elements
function compare_col_key_id($a, $b) {
if ($a['key_id'] === $b['key_id']) return 0;
return ($a['key_id'] > $b['key_id']) ? 1 : -1;
}
$difference_elems = array_udiff($a, $b, 'compare_col_key_id');
// and if you just want the keys out
function get_col_key_id($a) {
return $a['key_id'];
}
$difference_justkeys = array_map('get_col_key_id', $difference_elems);
这更好的是它首先过滤元素,然后仅在需要时创建仅键控数组,并且仅为已经过滤的元素创建。否则它基本上是相同的,也许是以更干净的方式。
我可能会将它包装在一个类中,该类将在构造函数中获取列id,并使用私有变量中的列id将上述函数作为方法。
答案 1 :(得分:0)
正常工作:
$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 );