php - PHP:从 $x-deep 多维数组递归创建二维数组
问题描述
为了创建 Excel 报表,我需要创建一个二维数组:
[0] => Array (
[0] = Value A1
[1] = Value B1
[2] = Value C1a
[3] = Value C1b
)
[1] => Array (
[0] = Value A1
[1] = Value B1
[2] = Value C2a
[3] = Value C2b
)
[2] => Array (
[0] = Value A1
[1] = Value B1
[2] = Value C3a
[3] = Value C3b
)
[3] => Array (
[0] = Value A1
[1] = Value B2
[2] = Value C4a
[3] = Value C4b
)
[4] => Array (
[0] = Value A1
[1] = Value B2
[2] = Value C5a
[3] = Value C5b
) ...
从 $x-deep(1-5 层)多维数组:
[0] => Array (
[name] = Value A1
[data] => Array (
[0] => Array(
[name] = Value B1
[data] => Array (
[0] => Array (
[name] = Value C1a
[secondary] = Value C1b
)
[1] => Array (
[name] = Value C2a
[secondary] = Value C2b
)
[2] => Array (
[name] = Value C3a
[secondary] = Value C3b
)
)
)
[1] => Array(
[name] = Value B2
[data] => Array (
[1] => Array (
[name] = Value C4a
[secondary] = Value C4b
)
[2] => Array (
[name] = Value C5a
[secondary] = Value C5b
)
[3] => Array (
[name] = Value C6a
[secondary] = Value C6b
)
)
)
)
[1] => Array (
[name] = Value A2
[data] => Array (
[0] => Array(
[name] = Value B1
[data] => Array (
[0] => Array (
[name] = Value C1a
[secondary] = Value C1b
)
[1] => Array (
[name] = Value C2a
[secondary] = Value C2b
)
[2] => Array (
[name] = Value C3
[secondary] = Value C3b
)
)
)
[1] => Array(
[name] = Value B2
[data] => Array (
[1] => Array (
[name] = Value C4a
[secondary] = Value C4b
)
[2] => Array (
[name] = Value C5a
[secondary] = Value C5b
)
[3] => Array (
[name] = Value C6a
[secondary] = Value C6b
)
)
)
)
) ...
[data]
在将数据数组传递给自身之前,递归调用会检查是否已填充。
在尝试了多种递归迭代数组的方法(foreach()、RecursiveArrayIterator、array_walk() 等)后,在到达“B1”末尾并切换到“B2”后,我似乎无法正确构建所需的数组 -由于在迭代“C”时添加了多个元素(1 个或更多),我最终会得到一个看起来更像这样的数组:
[3] => Array (
[0] = Value A1
[1] = Value B1
[2] = Value B2
[3] = Value C4a
[4] = Value C4b
)
我想知道是否有人能指出我正确的方向。
干杯!
编辑:
在其当前的半开发状态下添加代码
<?php
class Report {
//
// Data processors and other functions snipped
//
public function flattenForExcel() {
$excelArray = [];
$index = 0;
$data = $this->getProcessedData();
foreach ($data as $datum) {
$excelArray = $this->recursivelyFlattenForExcel($datum, $excelArray, $index);
}
return $excelArray;
}
public function recursivelyFlattenForExcel($datum, $returnArray, &$index) {
$added = 0;
$showInExcel = $datum['config']['show_in_excel'];
foreach ($showInExcel as $showValue) {
$returnArray[$index][] = $datum[$showValue];
$added++;
}
$cloneArray = array_slice($returnArray[$index], 0, $added * -1);
if (!empty($datum['data'])) {
foreach ($datum['data'] as $moreDatum) {
$returnArray = $this->recursivelyFlattenForExcel($moreDatum, $returnArray, $index);
}
} else {
$index++;
}
$returnArray[$index] = $cloneArray;
return $returnArray;
}
}
解决方案
推荐阅读
- python - virtualenv中的间歇性pip安装错误?
- php - 使用codeigniter,管理员想要批准用户的注册请求。但它没有正常发生
- facebook - 从多个页面 facebook graph API 中删除多个帖子
- python - 根据子列表python的大小将元素添加到列表中
- c# - 从 Azure 中托管的 Asp.net Core MVC Web App 获取“响应状态代码不表示成功:502(错误网关)”
- java - ACRA 在模拟器上工作,但不在真实设备上
- javascript - Draw rectangle over HTML 5 tag video
- c# - C# 中输出参数的良好做法
- python - 反转负整数会导致意外结果
- c# - 如何在 asp classic 中使用 ionic zip 或 dot net zip