PHP数组结构转换求助:将横向数组转为纵向关联数组
解决PHP数组结构转换问题
没问题,这个数组转结构的需求其实很常见,我来给你两种简单好用的实现方式:
首先先理清楚需求差异:你需要把横向分组的数组(按subject/grade/received分类,每组存对应的数据列表),转换成纵向分组的数组(按单条数据打包,每条数据包含对应的科目、成绩和年份)。
方法一:foreach循环(直观易懂,适合新手)
这种方式逻辑直白,容易理解:
// 你的原数组 $original = [ 'subject' => ['math', 'english'], 'grade' => ['a', 'b'], 'received' => ['2017', '2016'] ]; $result = []; // 假设所有子数组长度一致,取第一个子数组的长度作为循环次数 $totalItems = count($original['subject']); for ($i = 0; $i < $totalItems; $i++) { $result[] = [ 'subject' => $original['subject'][$i], 'grade' => $original['grade'][$i], 'received' => $original['received'][$i] ]; } // 输出结果就是你想要的结构 print_r($result);
方法二:array_map(简洁高效,代码更优雅)
如果追求代码精简,array_map是绝佳选择,它会自动把多个数组的同索引元素配对组合:
$original = [ 'subject' => ['math', 'english'], 'grade' => ['a', 'b'], 'received' => ['2017', '2016'] ]; $result = array_map(function($subj, $g, $recv) { return [ 'subject' => $subj, 'grade' => $g, 'received' => $recv ]; // 也可以用compact简化写法:return compact('subj', 'g', 'recv'); 记得把参数名改成和键名一致 }, $original['subject'], $original['grade'], $original['received']); print_r($result);
小提示
- 两种方法都默认原数组里所有子数组的长度是相同的,如果存在长度不一致的情况,
array_map会以最长的数组为准,缺失的元素会补为null;循环法则需要额外加判断避免数组越界报错。 - 如果你不确定子数组长度是否统一,可以先做个校验:用
array_unique(array_map('count', $original))获取所有子数组的长度,判断结果是否只有一个值。
内容的提问来源于stack exchange,提问作者J Foley
相关产品推荐
相关产品推荐

