当子数组的一个值与另一个数组值匹配时,从数组中删除子数组 (PHP)



我有两个数组:

$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
        )
)

相关内容

  • 没有找到相关文章

最新更新