我正在尝试创建一个新数组,其中键将是第一个数组的标头,而值将是所有其他数组,但结果是我得到一个空数组。
这是我的初始数组
$reader = \Asan\PHPExcel\Excel::load('test.xls', function(\Asan\PHPExcel\Reader\Xls $reader){});
foreach ($reader as $row)
{
print_r($row);
}
Array
(
[0] => Phone
[1] => Sum
[2] => Name
[3] => Something else
)
Array
(
[0] => +1 555123456
[1] => 50.00
[2] => Johnny Doe
[3] => 100.50
)
Array
(
[0] => 911
[1] => 20.12
[2] => Eli the Computer Guy
[3] => 99.99
)
我试图像这样创建新数组
$row = 1; // header row
foreach ($reader as $row)
{
if ($row == 1)
{
$headers = $row;
}
else
{
$new_array[] = [
$headers => $row;
]
}
print_r($row); // prints empty array
}
我希望结果数组看起来像这样
Array
(
[0] => Array
(
[Phone] => +1 555123456
[Sum] => 50.00
[Name] => Johnny Doe
[Something else] => 100.50
)
[1] => Array
(
[Phone] => 911
[Sum] => 20.12
[Name] => Eli the Computer Guy
[Something else] => 99.99
)
)
答案 0 :(得分:6)
您还可以使用array_map和array_combine:
$headers = array_shift($arrays);
$result = array_map(function($x) use ($headers){
return array_combine($headers, $x);
}, $arrays);
答案 1 :(得分:3)
您正在用读取器$row
的值覆盖行计数器foreach ($reader as $row)
。您还缺少行计数器上的增量。解决了这些问题后,您可以使用array_combine
解决问题:
$row = 1; // header row
$new_array = array();
foreach ($reader as $data)
{
if ($row == 1)
{
$headers = $data;
}
else
{
$new_array[] = array_combine($headers, $data);
}
$row++;
}
print_r($new_array);
答案 2 :(得分:0)
作为Nick的答案,但使用数组键作为条件来检查第一个数组元素(索引为0)。
<?php
$data =
[
['shape', 'sides'],
['square', 4],
['triangle', 3]
];
foreach ($data as $key => $row) {
if($key == 0) {
$headers = $row;
} else {
$output[] = array_combine($headers, $row);
}
}
var_export($output);
输出:
array (
0 =>
array (
'shape' => 'square',
'sides' => 4,
),
1 =>
array (
'shape' => 'triangle',
'sides' => 3,
),
)
逻辑可以稍微翻转一下,以形成难以理解的单行代码:
foreach ($data as $key => $row)
$key
? $output[] = array_combine($headers, $row)
: $headers = $row;
通常array_shift
用于提取标题行。然后,您可以遍历行,而无需在循环中添加其他条件混乱情况。