使用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
相关产品推荐
相关产品推荐

