首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法删除数组中的特定项

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

Stack Overflow用户
提问于 2019-01-22 05:35:36
回答 3查看 52关注 0票数 0

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

代码语言:javascript
运行
复制
Array
(
    [0] => Array
        (
            [id] => 53
        )

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

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

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

代码语言:javascript
运行
复制
foreach($to_remove as $id)
{
     $key = array_search($id, array_column($content, 'id'));
     unset($content[$key]);   
}

问题是,在最终结果中,我得到了:

代码语言:javascript
运行
复制
Array
(
    [2] => Array
        (
            [answer] => >20%
            [points] => 3
            [id] => 60
        )

)

为什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-22 05:51:46

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

使用array_splice()而不是unset。这将调整所有索引。

代码语言:javascript
运行
复制
foreach($to_remove as $id)
{
     $key = array_search($id, array_column($content, 'id'));
     array_splice($content, $key, 1);   
}
票数 2
EN

Stack Overflow用户

发布于 2019-01-22 05:57:13

这里有一个有趣的方式:

代码语言:javascript
运行
复制
$content = array_intersect_key($content,
                               array_diff(array_column($content, 'id'), $to_remove));

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

票数 2
EN

Stack Overflow用户

发布于 2019-01-22 05:55:15

您使用的是array_column($content, 'id'),它将运行3次,因为foreach在第一次给出了一个这样的数组。

代码语言:javascript
运行
复制
Array
(
    [0] => 53
    [1] => 54
    [2] => 60
)

第二次等等。

代码语言:javascript
运行
复制
Array
(
    [0] => 54
    [1] => 60
)

然后,array_search将返回53的第一个对应的密钥,第一次找到密钥0。

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

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

代码语言:javascript
运行
复制
$content = array_filter($content, function($x) use($to_remove) {
    return !in_array($x["id"], $to_remove);
});

Php demo

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54298079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档