[英]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.