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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:49:20