使用php在数组中查找唯一数据

时间:2011-12-28 06:01:47

标签: php arrays key

我有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]部分。任何帮助将非常感激。

4 个答案:

答案 0 :(得分:1)

尝试:


print_r(array_unique($arr1 + $arr2));

答案 1 :(得分:1)

  1. 从两个阵列中获取唯一的ID。
  2. 计算它们之间的差异(不在两者中的项目)。
  3. 将原始数组过滤为差异中的项目。
  4. 这是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)

  1. 在所有阵列中加入所有“unique_id”。
  2. 过滤掉重复项以获得唯一身份。
  3. 根据唯一身份过滤所有数组。
  4. 以下是对一个,两个或多个数组进行操作的函数,第一个参数是用于唯一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);
    }