首页 > 解决方案 > 当两个值的值不同时如何从数组中删除数组值

问题描述

我有两个数组,我想从 array2中删除重复记录。我不想在数组 2 中记录 link_id 35,因为数组 1 中存在 link_id 35 记录,因此它不会显示在数组 2 中。

我尝试使用 array_map 和 Unique 方法,但效果不佳,因为我认为这两个数组的值不同。

$array1=

[0] => stdClass Object
        (
            [link_id] => 35
            [link_name] => Test Listerine cool mint packets 3 pack
            [alias] => aa
            [link_desc] => 
            [user_id] => 47
            [link_hits] => 103
            [link_votes] => 1
            [link_rating] => 5.000000
            [link_featured] => 0
            [link_published] => 1
            [link_approved] => 1
            [link_template] => 

        )

    [1] => stdClass Object
        (
            [link_id] => 373
            [link_name] => Test Subject Data Collection Fish Fresh Yellow Tail
            [alias] => ba
            [link_desc] =>
            [user_id] => 47
            [link_hits] => 198
            [link_votes] => 8
            [link_rating] => 2.875000
            [link_featured] => 0
            [link_published] => 1
            [link_approved] => 1
            [link_template] => 

        )



$array2 =

    [0] => stdClass Object
        (
            [link_id] => 35
            [link_name] => Test Listerine cool mint packets 3 pack
            [link_desc] => 
            [lat] => 0.000000
            [lng] => 0.000000
            [contactperson] => 
            [cat_name] => AA - Made in USA
            [link_votes] => 1
            [link_rating] => 5.000000
            [link_featured] => 0
            [value] => 30020864
        )

    [1] => stdClass Object
        (
            [link_id] => 541
            [link_name] => Test Subject Data Collection Fish Fresh Yellow Tail
            [link_desc] => 
            [lat] => 25.182573
            [lng] => -80.093079
            [country] => United States
            [postcode] => 33431
            [contactperson] => Captain Jack Certified Charters
            [cat_name] => BA - Product of USA
            [link_votes] => 8
            [link_rating] => 2.875000
            [link_featured] => 0
            [value] => NA
        )

标签: phparrays

解决方案


你可以用array-filter做到这一点。首先ids从第一个数组中提取所有元素,然后根据这些 id 过滤第二个数组。

$arr1 = array( (object) ["link_id"=> 35, "key" => "AAA"], (object) ["link_id"=> 373, "key" => "BBB"]);
$arr2 = array( (object) ["link_id"=> 35, "key" => "CCC"], (object) ["link_id"=> 341, "key" => "DDD"]);

$ids = array_column($arr1, "link_id");
$arr2 = array_filter($arr2, function ($e) use ($ids) {
    return !in_array($e->link_id, $ids); //keep him in arr2 only if NOT in ids of arr1
});

更新更快的答案考虑大量数据(至于@mickmackusa 评论)使用这个:

$ids = [];
foreach($arr1 as $e)
    $ids[$e->link_id] = true;

$arr2 = array_filter($arr2, function ($e) use ($ids) {
    return !isset($ids[$e->link_id]);
});

第一个解决方案在O(n^2),第二个解决方案在O(n)


推荐阅读