查找数组差异

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

我有2个数组:

$network_keys= array(
    (int) 0 => '7 ADELAIDE',
    (int) 1 => '7TWO ADELAIDE'
);

$dblist = array(
    (int) 0 => array(
        'PrpMedia' => array(
            'id' => (int) 3,
            'network_key' => '7 ADELAIDE',
            'media_id' => (int) 43
        ),
        'Media' => array(
            'id' => (int) 43,
            'media_type_id' => (int) 5,
            'media_location_id' => (int) 4,
            'media_name' => 'Channel 7 ADELAIDE',
            'deleted' => false
        )
    ),
    (int) 1 => array(
        'PrpMedia' => array(
            'id' => (int) 4,
            'network_key' => 'VIC 1HD BENDIGO',
            'media_id' => (int) 42
        ),
        'Media' => array(
            'id' => (int) 42,
            'media_type_id' => (int) 5,
            'media_location_id' => (int) 4,
            'media_name' => '7MATE',
            'deleted' => false
        )
    )
)

我想找出

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

需要明确的是,我们正在寻找

$dblist[0]['PrpMedia']['network_key']

预期数组:

$difference = array('7TWO ADELAIDE');
php
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.