将数组与标头组合-获取空数组

时间:2018-11-01 08:01:04

标签: php arrays

我正在尝试创建一个新数组,其中键将是第一个数组的标头,而值将是所有其他数组,但结果是我得到一个空数组。

这是我的初始数组

$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
        )
)

3 个答案:

答案 0 :(得分:6)

您还可以使用array_maparray_combine

$headers = array_shift($arrays);
$result = array_map(function($x) use ($headers){
    return array_combine($headers, $x);
}, $arrays);

Demo

答案 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);

Demo on 3v4l.org

答案 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用于提取标题行。然后,您可以遍历行,而无需在循环中添加其他条件混乱情况。