【问题标题】:Filtering out array duplicates by under key element通过关键元素过滤掉数组重复项
【发布时间】:2017-10-09 22:30:35
【问题描述】:

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

我要数组

// $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 数组具有相同的类别但其中的值不同,它仍将显示相同的类别。

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

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

提前致谢!

【问题讨论】:

    标签: php arrays filtering


    【解决方案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);
    

    【讨论】:

    • 我知道我已经接受了答案,但是在 php 5.5 中有没有办法做到这一点?顺便说一句,代码写得很好:)
    • 添加了array_filter的替代品,请检查它是否按预期工作。
    • 谢谢,只是一个离题的问题,我如何才能学会写出如此简洁的代码 :))
    • 不确定您所说的整洁是什么意思?
    猜你喜欢
    • 2010-10-27
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-18
    • 2018-03-14
    • 1970-01-01
    相关资源
    最近更新 更多