我有两个数组:
$to_import = Array(
[0] => Array(['native_id'] => 35339920, ['type'] => product)
[1] => Array(['native_id'] => 22045872, ['type'] => product)
[2] => Array(['native_id'] => 25913185, ['type'] => profile)
[3] => Array(['native_id'] => 14354407, ['type'] => profile)
)
$existing = Array(
[0] => Array(['native_id'] => 22045872)
[1] => Array(['native_id'] => 25913185)
[2] => Array(['native_id'] => 30836971)
)
当在第二个数组中找到id时,以及当类型与"profile"匹配时,我需要从第一个数组中删除记录。因此,在这个例子中,剩下三个:
$to_import = Array(
[0] => Array(['native_id'] => 35339920, ['type'] => product)
[1] => Array(['native_id'] => 22045872, ['type'] => product)
[3] => Array(['native_id'] => 14354407, ['type'] => profile)
)
我发现了类似的问题,但我不知道如何将它们应用于我的需求。这个答案看起来很接近我想要的,但我无法让它发挥作用,我的知识让我失望了。
$existing_ids = array_column($existing, 'native_id', 'native_id');
$to_import = array_filter($to_import, function ($item) use ($existing_ids) {
return $item['type'] != 'profile' || !isset($existing_ids[$item['native_id']]);
});
我们在这里创建了一个数组$existing_ids
,它包含所有现有的id作为其密钥,因此使用isset
查找非常快速。您可以使用in_array
,但速度会慢一些。从那里它是一个非常简单的array_filter
操作。
请参阅http://php.net/array_column.如果您有PHP<5.5
这应该适用于您:
在这里,我只是用array_map()
遍历您的$to_import
数组,并检查密钥是否不在$keys
数组中,或者它不是类型profile
。
<?php
$keys = array_column($existing, "native_id");
$result = array_filter(array_map(function($v)use($keys){
if(!in_array($v["native_id"], $keys) || $v["type"] != "profile")
return $v;
}, $to_import));
print_r($result);
?>
输出:
Array
(
[0] => Array
(
[native_id] => 35339920
[type] => product
)
[1] => Array
(
[native_id] => 22045872
[type] => product
)
[3] => Array
(
[native_id] => 14354407
[type] => profile
)
)