我有一个具有以下结构的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);
答案 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";
}
给您很好的格式化:)