Создание многомерного массива из логики CSV

Я хочу создать массив, который следует моей «логике CSV«, но я борюсь.

Вот своего рода пример содержания CSV:

+------------+----------+-------------+---------+
|    Name    | Duration |    User    |  Level   |
+------------+----------+------------+----------+
| Bestall    | 7 Days   |            |    T     |
| Bestleft   | 6 Days   |            |   ST     |
| Turn       | 2 Days   |   Brother  |          |
| Jump       | 4 Days   |   Sister   |          |
| Bestdown   | 1 Day    |            |   ST     |
| Play       | 1 Day    |   Sister   |          |
+------------+----------+------------+----------+

Поэтому я пытаюсь создать измерение на уровне .

T означает название, а ST-субтитры .

В этом примере результирующий массив будет:

[Bestall] => Array 
         (
            [Duration] => 7 Days
            [Bestleft] => Array 
                       (
                         [Duration] => 6 Days
                         [0] => Array 
                             (    
                                [Name] => Turn     
                                [Duration] => 2 Days
                                [User] => Brother
                             )
                         [1] => Array 
                             (    
                                [Name] => Jump
                                [Duration] => 4 Days
                                [User] => Sister
                             )
                       )
            [Bestdown] => Array
                       (                           
                         [Duration] => 1 Day
                         [0] => Array 
                             (    
                                [Name] => Play
                                [Duration] => 1 Day
                                [User] => Sister
                             )
                       )
         )

Мой фактический код для этого (не работает)

    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE)
    {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
        {
            $level = $row[count($row)-1];
            $titled = false;
            if($level=='T') {
                $titled = $row[0];
                $data[$titled] = $row;
            }
            elseif($level=='ST')
                $data[$titled][] = $row;
            array_push($data[$titled], $row);
        }
        fclose($handle);
    }

2 ответа

  1. Пример CSV для создания массива

    $filename = base_url() . 'yor_file.csv';
    
    $content = file_get_contents($filename);
    
    $lines = explode("\n", $content);
    
    $lenthOfCsvRows = 50;
    $tempArray = array();
    $csvArray = array();
    for ($i = 1; $i <= $lenthOfCsvRows; $i++) {
        $data = explode("\t", $lines[$i]);
    
        $tempArray['nameKey'] = array(
            '1' => $data[0],
            '2' => $data[1],
            '3' => $data[2],
            '4' => $data[3],
        );
        $csvArray[]= $tempArray;
    }
    print_r($csvArray);
    
  2. Вот код php, который вам нужен:

    $data = array();
    $t = false;
    $st = false;
    
    if (($handle = fopen($filename, 'r')) !== FALSE)
    {
        $header = fgetcsv($handle, 1000, $delimiter);
    
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
        {
            $level = $row[count($row)-1];
    
            if($level=='T') {
                $t = $row[0];
                $data[$t][$header[1]] = $row[1];
            }
            elseif($level=='ST'){
    
                $st = $row[0];
    
                $data[$t][$st][$header[1]] = $row[1];
            }
            else{
    
                $tmp_row = array(
                    $header[0] => $row[0],
                    $header[1] => $row[1],
                    $header[2] => $row[2]
                    );
    
                $data[$t][$st][] = $tmp_row;    
            }
    
        }
        fclose($handle);
    }
    
    print_r($data);