如何从多维数组中删除一个数组?

3

我有一个多维数组,它是一个类似于动态数组的数据结构,例如:

Array
(
    [0] => Array
        (
            [key] => delete
            [label] => hi Delete
        )

    [1] => Array
        (
            [key] => edit
            [label] => hi Edit
        )

    [2] => Array
        (
            [key] => update
            [label] => hi update
        )

)

现在我想从上面的多维数组中删除下面的一个数组:
Array
    (
        [key] => delete
        [label] => hi Delete
    )

最终我希望得到的输出如下:

数组 (

    [0] => Array
        (
            [key] => edit
            [label] => hi Edit
        )

    [1] => Array
        (
            [key] => update
            [label] => hi update
        )

)

我已经尝试了以下代码,如下所示:

<?php
  $arr1 = array(array("key" => "delete", "label" => "hi Delete"),array("key" => "edit", "label" => "hi Edit"), array("key" => "update", "label" => "hi update"));
   $diff = array_diff_assoc($arr1, array("key" => "delete", "label" => "hi Delete"));
   print_r($diff);
?>

但是我在输出中得到了完整的 $arr1:

Array
(
    [0] => Array
        (
            [key] => delete
            [label] => hi Delete
        )

    [1] => Array
        (
            [key] => edit
            [label] => hi Edit
        )

    [2] => Array
        (
            [key] => update
            [label] => hi update
        )

)

请帮忙告诉我如何做到这一点


你可以尝试使用unset($arr1[0]); - Amit Kumar
这里的数组是动态的,我不知道索引。 - lazyCoder
看一下这个:http://php.net/manual/en/function.array-diff-assoc.php array_diff的工作方式与您预期的不同。 - Twinfriends
我也尝试使用多维数组。 - lazyCoder
http://php.net/manual/en/function.array-search.php - Amit Kumar
显示剩余3条评论
2个回答

3

使用带有callbackarray_filter

$arr1 = array_filter($arr1, function ($var) {
    return $var['key'] != 'delete';
});
print_r($arr1);

但是索引的顺序没有正确排列,它删除了第0个索引并从1个索引开始数组。 - lazyCoder
OP提到了数千条记录,并且似乎关注性能问题,使用PHP的array_函数比遍历集合要慢得多。 - Stuart
2
@BunkerBoy 然后 $arr1 = array_values($arr1); - L. Herrera

1
你需要循环遍历数组并测试要移除的键,如下所示:(写盲目,因此您需要进行测试!)
<?php
foreach ($arr1 as $thisArrIndex=>$subArray)
{
    if ( $subArray['key'] == "delete" )
    {
        unset($arr1[$thisArrIndex]);
    }
}
?>

建议的修改是在找到键后跳出循环。似乎 OP 可能有多个类似这样的键(在多个子数组中),所以我选择不在此处跳出循环。

我不能使用循环@Stuart,有没有任何函数可以做到这一点? - lazyCoder
为什么不能使用 foreach...? - Stuart
你可以使用foreach在大约0.3秒内循环遍历100万条记录... -- @Saty的答案不错,但性能比使用foreach慢两倍... - Stuart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接