You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用array_merge筛选数组结构异常,如何获取预期二维数组?

解决PHP二维数组按ID筛选后结果异常的问题

你的问题出在对array_merge的用法理解上:当你用array_merge($result, $item)时,$item是一维数组,array_merge会直接把它的键值对合并到$result中,而非将整个$item作为子元素添加。由于多个匹配项的键(比如id、name)重复,后面的元素会覆盖前面的,最终只保留最后一个匹配项的一维结构。

下面是几种正确的解决方案:

解法一:直接追加匹配元素(最推荐)

这是最简单高效的方式,直接把符合条件的一维数组作为元素追加到结果数组中:

$records = [
    ['id' => 14, 'name' => 'Alice'],
    ['id' => 15, 'name' => 'Bob'],
    ['id' => 16, 'name' => 'Charlie'],
];
$ids = [14, 16];
$result = [];

foreach ($records as $item) {
    if (in_array($item['id'], $ids)) {
        $result[] = $item; // 直接将匹配项加入结果数组
    }
}

print_r($result);

执行后$result就是包含目标元素的二维数组,完全符合预期。

解法二:用array_merge(需包装子数组)

如果一定要用array_merge,需要将单个匹配项包装成一维数组后再合并,避免键值覆盖:

$result = [];
foreach ($records as $item) {
    if (in_array($item['id'], $ids)) {
        $result = array_merge($result, [$item]); // 把$item放入数组后再合并
    }
}

这种方式也能得到正确结构,但效率略低于直接追加,因为每次array_merge都会重新生成数组。

解法三:用array_filter简化代码

如果追求代码简洁,可以用array_filter替代foreach:

$result = array_filter($records, function($item) use ($ids) {
    return in_array($item['id'], $ids);
});

// 可选:如果需要重置数组索引(array_filter会保留原数组的键)
$result = array_values($result);

这种写法更简洁,适合逻辑简单的筛选场景。

内容的提问来源于stack exchange,提问作者The Reider

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:01:22