簡體   English   中英

將CSV轉換為多維關聯數組

[英]Convert CSV to Multidimensional Associative Array

我有一個具有以下結構的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)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";
}

留給您很好的格式化:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM