通过键元素过滤掉数组重复项

时间:2017-10-09 06:52:49

标签: php arrays filtering

我想通过下面的类别中的数组键过滤掉多维数组中的重复项。

我必须使用数组

// $selectedOffers
    Array 
    (
        [Category1] => Array 
        (
            [2424] => Array 
            (
                [node_name] => Name2424
            )
            [2525] => Array 
            (
                [node_name] => Name2525
            )
        )
        [Category2] => Array 
        (
            [2121] => Array 
            (
                [node_name] => Name2121
            )
            [2222] => Array 
            (
                [node_name] => Name2222
            )
        )
    )

// $myProducts    
    Array 
    (
        [Category1] => Array 
        (
            [2323] => Array 
            (
                [node_name] => Name2323
            )
            [2525] => Array 
            (
                [node_name] => Name2525
            )
        )
    )

为了过滤它们,我使用了array_diff_key($selectedOffers, $myProducts)。问题是它是按类别过滤而不是按元素过滤。因此,如果$ selectedOffers和$ myProducts数组具有相同的类别但其中的值不同,则它将显示相同的类别。

我在考虑循环使用类别和构建新数组,但是想知道是否有更简单的方法可以做到这一点。

任何提示和帮助都将不胜感激!

提前致谢!

1 个答案:

答案 0 :(得分:1)

<?php


$data = 
[
    [
        1 => [],
        2 => []
    ],
    [
        3 => [],
        4 => []
    ]
];

$mine = 
[
    [
        2 => []
    ],
    [
        3 => [],
        5 => []
    ]
];


$ids = [];
foreach($mine as $outer)
    foreach($outer as $k => $v)
        $ids[] = $k;

$filter = function($k) use ($ids) {
    return false === array_search($k, $ids);
};

$filtered = array_map(function($v) use ($filter) {
    return array_filter($v, $filter, ARRAY_FILTER_USE_KEY);
}, $data);

var_export($filtered);

输出:

array (
0 => 
array (
    1 => 
    array (
    ),
),
1 => 
array (
    4 => 
    array (
    ),
),
)

对于Php 5.5(看起来好像你可以跳过使用array_filter):

$ids      = array_flip($ids);
$filtered = array_map(function($v) use ($ids) {
    return array_diff_key($v, $ids);
}, $data);