我有两个数组:
$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时,以及当type匹配'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)
)
我发现了类似的问题,但我无法弄清楚如何将它们应用到我的要求中。 This答案看起来很接近我想要的,但我无法让它工作,我的知识让我失望。
答案 0 :(得分:3)
$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。
答案 1 :(得分:1)
这应该适合你:
在这里,我只使用$to_import
浏览您的array_map()
数组,并检查密钥是否不在$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
)
)