无法删除数组中的特定项目

时间:2019-01-21 21:35:36

标签: php

我有一个包含以下各项的数组(content):

Array
(
    [0] => Array
        (
            [id] => 53
        )

    [1] => Array
        (
            [id] => 54
        )

    [2] => Array
        (
            [id] => 60
        )
)

我想删除另一个数组中具有特定ID的所有项目,例如:$to_remove = ["53", "54", "60"],我所做的是:

foreach($to_remove as $id)
{
     $key = array_search($id, array_column($content, 'id'));
     unset($content[$key]);   
}

问题在于最终结果是:

Array
(
    [2] => Array
        (
            [answer] => >20%
            [points] => 3
            [id] => 60
        )

)

为什么?

3 个答案:

答案 0 :(得分:2)

问题在于array_column()返回的数组与原始数组使用的键不同。它返回的数组从0开始索引,但是unset不会重新索引该数组。因此,从数组中删除元素后,数组中的索引与array_column($content, "id");

的索引不同步

使用unset代替array_splice()。这将调整所有索引。

foreach($to_remove as $id)
{
     $key = array_search($id, array_column($content, 'id'));
     array_splice($content, $key, 1);   
}

答案 1 :(得分:2)

这是一种有趣的方式:

$content = array_intersect_key($content,
                               array_diff(array_column($content, 'id'), $to_remove));

从原始数据中提取id的值,用$to_remove计算差异,然后计算与原始数据的关键差异。

答案 2 :(得分:1)

您使用array_column($content, 'id')会运行3次,这是因为foreach首次为您提供了这样的数组。

Array
(
    [0] => 53
    [1] => 54
    [2] => 60
)

第二次,等等。

Array
(
    [0] => 54
    [1] => 60
)

然后,array_search将在第一次找到键0时返回53的第一个对应键。

在第二个循环中,它搜索54,找到键0,第三次找到键1。因此,在您的$content数组中,未设置的永远不会是2,并且不会被删除。

获得结果的另一种可能性是使用array_filter

$content = array_filter($content, function($x) use($to_remove) {
    return !in_array($x["id"], $to_remove);
});

Php demo