
本文详解如何在 php 中为动态构建的多维数组正确追加带自增整数键的子数组,避免因重复赋值导致仅保留最后一项的问题,并结合 xlsxwriter 实际场景给出健壮实现方案。
本文详解如何在 php 中为动态构建的多维数组正确追加带自增整数键的子数组,避免因重复赋值导致仅保留最后一项的问题,并结合 xlsxwriter 实际场景给出健壮实现方案。
在处理从 JSON、CSV 或文件读取的结构化数据时,常需将每条记录构造成一维数组(如 [id, first_name, last_name, street]),再汇总为二维数组用于后续导出(如 Excel)。但若错误地使用 $rader = array(array(...)) 每次重新赋值,会导致前序数据被覆盖——最终 print_r($rader) 仅显示最后一次循环的结果,且所有子数组都强制嵌套在索引 [0] 下,无法形成自然递增的行索引([0], [1], [2], …)。
根本原因在于赋值方式错误:
$rader = array(array($ordrenr, $fornavn, $etternavn, $adresse)); // ❌ 每次重置整个数组,仅存单行
这等价于 $rader = [[...]],始终将新行写入 $rader[0],旧值被丢弃。
✅ 正确做法:使用空方括号语法 [] 追加元素
PHP 中 $array[] = $value 会自动将 $value 追加到数组末尾,并分配下一个整数索引(0, 1, 2…)。因此,应在循环外初始化空数组,在循环内持续追加:
// ✅ 正确:初始化空数组,循环中追加每一行
$rader = []; // 关键:声明为空数组
foreach ($json_obj['items'] as $order) {
$ordrenr = $order['id'];
$fornavn = $order['billingPerson']['firstName'];
$etternavn = $order['billingPerson']['lastName'];
$adresse = $order['billingPerson']['street'];
// 直接追加一维数组(不额外嵌套)
$rader[] = [$ordrenr, $fornavn, $etternavn, $adresse];
}
// 此时 $rader 结构为:
// [
// [13564, 'Bill', 'Willson', 'St 4546'],
// [13295, 'Ken', 'Jibs', 'St 4156'],
// ...
// ]
print_r($rader);? 验证索引效果:执行后 print_r($rader) 将清晰显示 [0] => Array(...), [1] => Array(...),每行拥有唯一、连续的数字键。
整合到 XLSXWriter 导出流程(推荐完整写法):
注意:XLSXWriter::writeSheet() 要求传入的是「二维数组」(即行数组的集合),且每行应为一维数值索引数组(非关联数组)。上述 $rader[] = [...] 已满足此要求:
$rader = [];
$header = ['ID' => 'string', 'Firstname' => 'string', 'Lastname' => 'string', 'street' => 'string'];
foreach ($json_obj['items'] as $order) {
$rader[] = [
$order['id'],
$order['billingPerson']['firstName'],
$order['billingPerson']['lastName'],
$order['billingPerson']['street']
];
}
$writer = new XLSXWriter();
$writer->setAuthor('USERNAME');
$writer->writeSheet($rader, 'RESULT', $header); // ✅ 传入已正确索引的二维数组
$writer->writeToFile("/media/files/filename.xlsx");⚠️ 注意事项:
- 不要对每行再次用 array() 包裹(如 array([$a, $b])),这会生成三维结构 [[[...]]],导致导出异常;
- 确保 $rader 在循环前初始化($rader = []),否则未定义变量可能引发 Notice;
- 若需关联键(如 'id' => 13564),则必须使用 XLSXWriter 支持的关联数组格式(此时 $header 定义字段名,$rader[] 中的子数组也需为关联形式),但本例需求明确为数字索引,故采用数值数组更简洁高效。
通过遵循「初始化 → 循环追加」模式,即可轻松生成具备标准递增索引的多维数组,为数据导出、API 响应或进一步处理奠定可靠基础。

















