【发布时间】:2016-12-19 04:19:53
【问题描述】:
我有一个使用Yii2的项目,在我的项目中用户可以上传一个excel文件,系统读取数据并设置成一个新的二维数组,例如:
Example.xls
这是我在 Controller 中使用的代码:
for ($row = 1; $row <= $highestRow; ++$row) {
$rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
if (!is_null($rowData[0][0])) {
foreach ($rowData as $key => $value) {
foreach ($value as $vKey => $vValue) {
$tempArrayData[] = $vKey . "_" . $vValue;
}
}
$arrayData[] = $tempArrayData;
}
}
echo '<pre>';
print_r($arrayData);
echo '</pre>';
die();
我想在每个数组的值中添加"$key_" 作为两个第一个字符。
所以我使用 foreach 来做到这一点,我得到了这个结果:
Array
(
[0] => Array
(
[0] => 0_first_name
[1] => 1_last_name
[2] => 2_age
[3] => 3_sex
)
[1] => Array
(
[0] => 0_first_name
[1] => 1_last_name
[2] => 2_age
[3] => 3_sex
[4] => 0_Archie
[5] => 1_Will
[6] => 2_21
[7] => 3_Male
)
[2] => Array
(
[0] => 0_first_name
[1] => 1_last_name
[2] => 2_age
[3] => 3_sex
[4] => 0_Archie
[5] => 1_Will
[6] => 2_21
[7] => 3_Male
[8] => 0_Vani
[9] => 1_Priscillia
[10] => 2_21
[11] => 3_Female
)
)
但这不是我所期望的,在上面的结果中,数组数组总是从 Excel 数据的第一列开始。实际上,我需要这样的结果:
Array
(
[0] => Array
(
[0] => 0_first_name
[1] => 1_last_name
[2] => 2_age
[3] => 3_sex
)
[1] => Array
(
[0] => 0_Archie
[1] => 1_Will
[2] => 2_21
[3] => 3_Male
)
[2] => Array
(
[0] => 0_Vani
[1] => 1_Priscillia
[2] => 2_21
[3] => 3_Female
)
)
这是我需要的示例结果,有人知道如何获得上述结果吗?或者我如何修改上面的代码,以便我可以得到预期的结果。谢谢。
已编辑
如果我在foreach ($rowData as $key => $value) { 中删除这个foreach ($value as $vKey => $vValue) { 和print_r($value),结果如下:
Array
(
[0] => first_name
[1] => last_name
[2] => age
[3] => sex
)
Array
(
[0] => Archie
[1] => Will
[2] => 21
[3] => Male
)
Array
(
[0] => Vani
[1] => Priscillia
[2] => 21
[3] => Female
)
最终数组结果
Array
(
[0] => Array
(
[0] => Array
(
[0] => 0_first_name
[1] => 1_last_name
[2] => 2_age
[3] => 3_sex
)
)
)
[1] => Array
(
[0] => Array
(
[0] => 0_Archie
[1] => 1_Will
[2] => 2_21
[3] => 3_Male
)
)
[2] => Array
(
[0] => Array
(
[0] => 0_Vani
[1] => 1_Priscillia
[2] => 2_21
[3] => 3_Female
)
)
)
解决此案的最终代码:
$arrayData = [];
for($row = 1; $row <= $highestRow; ++$row) {
$rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
$arrayData[] = array_map(function($values) {
if (!is_null($rowData[0][0])) {
$tempArrayData = [];
foreach($values as $key => $value) {
$tempArrayData[] = $key . '_' . $value;
}
return $tempArrayData;
}, $rowData);
}
}
更新
项目有更新需求,项目已成功创建结果如上Final Result。但是现在数组需要修改,预期的结果是这样的:
Array
(
[0] => Array
(
[0] => Array
(
[0] => 0_first_name
[1] => 1_last_name
[2] => 2_age
[3] => 3_sex
)
)
[1] => Array
(
[0] => Array
(
[0] => 0_Archie
[1] => 1_Will
[2] => 2_21
[3] => 3_Male
)
)
[2] => Array
(
[0] => Array
(
[0] => 0_Vani
[1] => 1_Priscillia
[2] => 2_21
[3] => 3_Female
)
)
)
有人知道如何解决这个问题吗?谢谢
【问题讨论】:
-
你能做到
print_r($rowData)并添加它,以便我们知道我们可以做什么吗? -
也许您需要删除此
foreach ($value as $vKey => $vValue) {并使用 print_r($value) 或 @Archibald 所说的检查 `foreach ($rowData as $key => $value) {' 中的内容。 -
@prateekkathal 如果我这样做
print_r($rowData),它只会打印上传的 Excel 文件第一列的值。所以在这种情况下,它会打印出Array ( [0] => Array ( [0] => 0_first_name [1] => 1_last_name [2] => 2_age [3] => 3_sex ) )
标签: php arrays excel multidimensional-array foreach