如果在多维数组的子数组中找到元素,则从平面数组中删除元素

问题描述 投票:0回答:2

我有2个数组:

$network_keys = ['7 ADELAIDE', '7TWO ADELAIDE'];

$dblist = [
    [
        'PrpMedia' => [
            'id' => 3,
            'network_key' => '7 ADELAIDE',
            'media_id' => 43
        ],
        'Media' => [
            'id' => 43,
            'media_type_id' => 5,
            'media_location_id' => 4,
            'media_name' => 'Channel 7 ADELAIDE',
            'deleted' => false
        ]
    ],
    [
        'PrpMedia' => [
            'id' => 4,
            'network_key' => 'VIC 1HD BENDIGO',
            'media_id' => 42
        ],
        'Media' => [
            'id' => 42,
            'media_type_id' => 5,
            'media_location_id' => 4,
            'media_name' => '7MATE',
            'deleted' => false
        ]
    ]
];

我想找出

$network_keys
中的哪些值不存在于
$dbList
中。

为了清楚起见,我们正在查看每个

['PrpMedia']['network_key']
行的
$dblist
子数组。

预期数组:

$difference = ['7TWO ADELAIDE'];
php arrays multidimensional-array filter array-difference
2个回答
2
投票

您可以使用 array_maparray_diff 的组合来做到这一点:

$diff = array_diff($network_keys, array_map(function($v) {
    return $v['PrpMedia']['network_key'];
}, $dblist));

在您给出的示例中,您将获得 $network_keys 的值,因为它们都没有出现在搜索到的数组中。

代码首先将

$network_keys
中的所有 ['PrpMedia']['network_key'] 值提取到一个数组中,该数组将具有与 $dblist 相同的平面结构。然后它只是简单地取差值,只保留 $dblist 中未出现在该中间数组中的元素。

请注意,此代码假设搜索的键

['PrpMedia']['network_key']
存在于 $network_keys 的所有元素中。如果不能假设情况总是如此,则添加一个检查,如下所示:

$diff = array_diff($network_keys, array_map(function($v) {
    return isset($v['PrpMedia']['network_key']) 
        ? $v['PrpMedia']['network_key']
        : null;
}, $dblist));

如果其中一个元素不存在

['PrpMedia']
键,这也可以正常工作。


0
投票

执行过滤前无需准备带有

array_map()
的过滤阵列。 只需使用
array_udiff()

在回调中,

$a
$b
变量可以来自任一数组。

尝试访问指定子数组列值;如果它不存在,则假设该变量保存相反数组中的值并使用字符串值。 演示

var_export(
    array_udiff(
        $network_keys,
        $dblist,
        fn($a, $b) => ($a['PrpMedia']['network_key'] ?? $a)
                      <=>
                      ($b['PrpMedia']['network_key'] ?? $b)
    )
);

输出:

array (
  1 => '7TWO ADELAIDE',
)
© www.soinside.com 2019 - 2024. All rights reserved.