我有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');
您可以使用 array_map 和 array_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']
键,这也可以正常工作。
执行过滤前无需准备带有
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',
)