我有一个包含以下各项的数组(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
)
)
为什么?
答案 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);
});