将CSV转换为多维关联数组

时间:2019-02-07 03:34:56

标签: php csv

我有一个具有以下结构的csv文件

name;timeframe;value1;value2;value3

示例文件如下所示

Abc;T1;V1,V2,V3
Abc;T2;V1,V2,V3
Abc;T3;V1,V2,V3
Xyz;T1;V1,V2,V3
Xyz;T2;V1,V2,V3
Xyz;T3;V1,V2,V3

名称可以在不同的时间范围内重复,并且可以有8个不同的时间范围。

我想要做的是在PHP中读取此csv文件,并将其转换为Associicative多维数组。这样我以后就可以将它打印为表格了

Name T1          T2           T3         
Abc  (v1,v2,v3)  (v1,v2,v3)   (v1,v2,v3)
Xyz  (v1,v2,v3)  (v1,v2,v3)   (v1,v2,v3)
Def  (v1,v2,v3)  (v1,v2,v3)   (v1,v2,v3)

到目前为止,我可以读取csv文件并打印单独的行并将其拆分为单独的字段。我被困的是使用关联数组来保存此信息,以便我可以像访问它一样

print($my_data_table['Abc']['T1'][V1])

不确定创建这种结构的最佳方法是什么。我对关联数组感兴趣的原因是,数据已附加到数据文件中,因此在文件末尾添加一条新记录,根据该数组替换现有数组中相应条目的值会容易得多。记录中的“名称”字段。到目前为止,这是我的代码

$f = fopen("scanner.txt", "r");
$names_array = array();
while (($line = fgetcsv($f)) !== false) {
        $row = $line[0];
        $cells = explode(";",$row);
        $names_array[$cells[0]] = array("T1","T2","T3");
        foreach ($cells as $cell) {
         //TODO: How to hold the values (v1,v2,v3) in specific cells of the data table   
        }
}
fclose($f);

1 个答案:

答案 0 :(得分:0)

1)fgetcsv可以用“;”分隔行本身:

因此,您可以将以下while循环打开运算符替换为以下内容:

while (($cells = fgetcsv($f, 0, ";")) !== false) {

您无需手动将行拆分为单元格。

2)您需要一个2D数组,每个项目都包含(v1,v2,v3),因此您可以使用$result[abc][T1] = (v1,v2,v3)之类的指令来访问它

因此,让我们创建它并填充数据:

$result = [];
while (($cells = fgetcsv($f, 0, ";")) !== false) {
    // You have name in your first cell, right?
    $name = $cells[0];
    // And your timeframe in second one
    $timeframe = $cells[1];
    // v1, v2 and v3 are in third, fourth and fifth cells:
    $v123 = [$cells[2], $cells[3], $cells[4]];
    // And now put it into result:
    $result[$name][$timeframe] = $v123;
}

现在,根据需要进行打印:

// Printing header:
foreach ($result as $name => $result_by_name)
{ 
    echo "Name  ";
    foreach ($result_by_name as $timeframe => $v123)
    {
         echo $timeframe . "   ";
    }
    //End of header
    echo "\n";
    //exiting loop, as we need only 1 header
}

foreach ($result as $name => $result_by_name)
{ 
    echo $name . "    ";
    foreach ($result_by_name as $timeframe => $v123)
    {
        echo join(", ", $v123) . " ";
    }
    echo "\n";
}

给您很好的格式化:)