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

时间:2015-06-28 12:34:31

标签: php arrays multidimensional-array

我有两个数组:

$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答案看起来很接近我想要的,但我无法让它工作,我的知识让我失望。

2 个答案:

答案 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
        )

)