Преобразование CSV в многомерном ассоциативного массива

Вопрос задан: 8 месяцев назад Последняя активность: 8 месяцев назад
up 0 down

У меня есть 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 различными временными рамками.

То, что я хочу сделать, это прочитать этот CSV-файл в PHP и преобразовать его в массив Assosicative многомерном. Так что я могу напечатать его в виде таблицы позже

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

Не уверен, что это лучший способ для создания такой структуры. Причиной Я заинтересован в ассоциативном массиве является то, что данные добавляются в файле данных, так с новой записью в конце файла будет гораздо проще просто заменить значения соответствующей записи в существующем массиве, основываясь на поле «Name» в записи. Это мой код до сих пор

$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 ответ

up 0 down

1) fgetcsv может разделить линии от «;» сам по себе:

Таким образом, вы можете заменить ваше время оператор открытия цикла к следующему:

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";
}

Оставляя хорошее форматирование к вам :)