我有2个看起来像这样的数组:
Array =>
[0] Array( [id]=434b5g6 [unique_id]=banana [level]=8)
[1] Array( [id]=bfrfnr [unique_id]=apple [level]=4)
[2] Array( [id]=yt347509 [unique_id]=grapefruit [level]=9 )
[3] Array( [id]=456645 [unique_id]=strawberry [level]=1)
Array =>
[0] Array( [id]=gon235g6 [unique_id]=strawberry [level]=8 )
[1] Array( [id]=bfrfnr [unique_id]=apple [level]=4 )
[2] Array( [id]=logujtng9 [unique_id]=grapefruit [level]=6 )
[3] Array( [id]=07yburhg [unique_id]=pinapple [level]=1)
我需要一种方法来删除两个数组中[unique_id]存在的元素,这样我就会留下2个只包含另一个不存在的元素的数组。例如,如果我们要在这两个数组上运行脚本,我应该留下:
Array =>
[0] Array( [id]=434b5g6 [unique_id]=banana [level]=8)
Array =>
[0] Array( [id]=07yburhg [unique_id]=pinapple [level]=1)
我真的不知道如何做到这一点。我知道有array_diff,但这只适用于单级数组。我使用多级别,只跟踪它的[unique_id]部分。任何帮助将非常感激。
答案 0 :(得分:1)
尝试:
print_r(array_unique($arr1 + $arr2));
答案 1 :(得分:1)
这是PHP 5.3 +的示例:
$uniqueIds1 = array_map(function ($item) { return $item['unique_id']; }, $array1);
$uniqueIds2 = array_map(function ($item) { return $item['unique_id']; }, $array2);
$reallyUniqueIds = array_merge(array_diff($uniqueIds1, $uniqueIds2), array_diff($uniqueIds2, $uniqueIds1));
$filteredArray1 = array_filter($array1, function ($item) use ($reallyUniqueIds) {
return in_array($item['unique_id'], $reallyUniqueIds);
});
$filteredArray2 = array_filter($array2, function ($item) use ($reallyUniqueIds) {
return in_array($item['unique_id'], $reallyUniqueIds);
});
说明:
array_map(function ($item) { return $item['unique_id']; }, $array1)
这只会将所有unique_id
值提取到像array('banana', 'apple', ...)
这样的数组中。
array_merge(array_diff($uniqueIds1, $uniqueIds2), array_diff($uniqueIds2, $uniqueIds1));
这会在两个数组之间创建差异,并将它们合并为一个数组,如:
array('banana', 'apple')
array('strawberry', 'apple')
-> array('banana', 'strawberry')
请参阅array_diff
。
然后最后,再次通过原始数组过滤掉unique_key
不在我们在上一步中创建的数组中的所有元素:
array_filter($array1, function ($item) use ($reallyUniqueIds) {
return in_array($item['unique_id'], $reallyUniqueIds);
})
这只是使用array_filter
的自定义回调函数,它告诉它过滤in_array($item['unique_id'], $reallyUniqueIds)
为false
的项目。
答案 2 :(得分:0)
foreach ( $array1 as $key1 => $innerarray1 ) {
foreach ( $array2 as $key2 => $innerarray2 ) {
if ($innerarray1['unique_id'] == $innerarray2['unique_id']) {
unset($array2[$key2]);
}
}
现在$ array2中将包含非常见的unique_id值
答案 3 :(得分:0)
以下是对一个,两个或多个数组进行操作的函数,第一个参数是用于唯一ID的键,任何另外一个是另一个数组。用法:
list($unique1, $unique2) = joined_uniquekey('unique_id', $array1, $array2);
代码:
function joined_uniquekey($key, $array1, $array2)
{
$arrays = func_get_args(); $key = array_shift($arrays);
$vkey = function($v) use ($key) {return $v[$key];};
$map = function($f) {return function(array $as) use ($f) {return array_map($f, $as);};};
$keys = array_count_values(call_user_func_array('array_merge', array_map($map($vkey), $arrays)));
foreach($keys as $k => $c) if ($c > 1) unset($keys[$k]);
$hkey = function($v) use ($key, $keys) {return isset($keys[$v[$key]]);};
$filter = function($f) {return function(array $a) use ($f) {return array_filter($a, $f);};};
return array_map($filter($hkey), $arrays);
}