我有一个包含以下项的数组(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
)
)为什么?
发布于 2019-01-22 05:51:46
问题是array_column()返回的数组没有使用与原始数组相同的键。它返回的数组从0开始编制索引,但unset不会对该数组重新编制索引。因此,从数组中删除元素后,数组中的索引与array_column($content, "id");的索引不同步
使用array_splice()而不是unset。这将调整所有索引。
foreach($to_remove as $id)
{
$key = array_search($id, array_column($content, 'id'));
array_splice($content, $key, 1);
}发布于 2019-01-22 05:57:13
这里有一个有趣的方式:
$content = array_intersect_key($content,
array_diff(array_column($content, 'id'), $to_remove));从原始数据中提取id值,使用$to_remove计算差异,然后计算与原始数据的关键差异。
发布于 2019-01-22 05:55:15
您使用的是array_column($content, 'id'),它将运行3次,因为foreach在第一次给出了一个这样的数组。
Array
(
[0] => 53
[1] => 54
[2] => 60
)第二次等等。
Array
(
[0] => 54
[1] => 60
)。
然后,array_search将返回53的第一个对应的密钥,第一次找到密钥0。
在第二个循环中,它搜索54,找到键0,第三次找到键1。因此,在您的$content数组中,未设置的值永远不会是2,也不会被删除。
获得结果的另一种可能是使用array_filter
$content = array_filter($content, function($x) use($to_remove) {
return !in_array($x["id"], $to_remove);
});https://stackoverflow.com/questions/54298079
复制相似问题