PHP如何根据指定顺序数组对多维数组元素进行正确排序
问题根因
原代码循环顺序写反了:
- 原逻辑是先遍历行内原有列,再遍历排序规则做匹配,最终输出顺序完全跟随
$data里列的原始排列,根本不会遵循$order定义的顺序 - 没有做匹配终止判断,极端情况会出现重复元素;不在
$order里的字段(比如示例中的undetected、mmyy)会直接被丢弃或者乱序插入,最终结果不符合预期。
修正后代码
function toCSV($data, $order) { $res = []; foreach ($data as $index => $row) { $str = []; // 以$order的顺序为基准遍历,保证输出顺序和规则完全一致 foreach ($order as $key) { foreach ($row as $column) { if ($column['key'] === $key) { $str[] = $column; break; // 匹配到就终止当前列查找,避免重复添加 } } } // 若需要保留不在$order规则内的列,取消下方注释即可 // foreach ($row as $column) { // if (!in_array($column['key'], $order)) { // $str[] = $column; // } // } $res[$index] = $str; } return $res; }
使用说明
- 输出列的顺序完全和传入的
$order数组顺序一致,不受原始数据列顺序影响 - 针对提供的测试入参,返回结果中第二行的
num字段会排在首位,mmyy、undetected这类不在$order里的字段默认不输出,开启注释后会自动追加到每行的末尾 - 等值判断用了严格相等
===,避免key类型隐式转换导致的匹配错误
内容的提问来源于stack exchange,提问作者Stasia
相关产品推荐
相关产品推荐

