2015-06-16 6 views
2

Я пытаюсь создать многомерный массив в PHP, где внутренние массивы являются ассоциативными следующим примером CSV строки $ CSV:создать многомерный ассоциативный массив из CSV в PHP

# Results from 2015-06-16 to 2015-06-16. 
date,time,label,artist,composer,album,title,duration 
2015-06-16,12:00 AM,Island,U2,"Clayton- Adam,The Edge,Bono,Mullen- Larry- Jr",Songs Of Innocence,SONG FOR SOMEONE,03:46 
2015-06-16,12:04 AM,Lowden Proud,"Fearing & White, Andy White, Stephen Fearing","White- Andy,Fearing- Stephen",Tea And Confidences,SECRET OF A LONG LASTING LOVE,03:10 
2015-06-16,12:07 AM,Columbia,The Wallflowers,"Dylan- Jakob,Irons- Jack,Mathis- Stuart,Richling- Greg,Jaffee- Rami",Glad All Over,REBOOT THE MISSION,03:31 
2015-06-16,12:10 AM,Distort Light,Bend Sinister,Moxon- Daniel,"Stories Of Brothers, Tales Of Lovers",JIMMY BROWN,03:48 

Количества фактических строк данных следующий за 3-строчным форматом является переменной. То, что я сделал до сих пор делается простой многомерный массив:

$resultArray = str_getcsv($csv, PHP_EOL);//parse the rows 
array_shift($resultArray);//shift out results first row: date info 
array_shift($resultArray);//shift out results new first row: field labels 
foreach($resultArray as &$row) {//parse the items in rows 
    $row = str_getcsv($row, ",", '"');//removes the '"' field enclosure? 
}//foreach 

Это делает функциональный многомерный массив, но то, что я не могу понять, как сделать внутренние массивы ассоциативные таким образом я могу получить доступ к ним с помощью текста чистые ключи из массива я ожидал с помощью:

$rowFieldKeysArray = array('date', 'time', 'label', 'artist', 'composer', 'album', 'title', 'duration'); 

Я уверен, что есть простой PHP способ использовать ключевое имя массив в качестве ключей для ассоциативного массива, но я не уверен, как это сделать. Я подозреваю, мне нужно что-то вдоль линий:

foreach($resultArray as $rowKey => &$row) { 
    $row[$rowFieldKeysArray[$rowKey]] = str_getcsv($row, ",", '"'); 
}//foreach 

Но это дает «Warning: Illegal строка смещения„дата“[...]».

Как мне это сделать?

EDIT: на основе комбинированной информации, предоставленной ссылке в комментарии Андрея и в ответ я принял, я был в состоянии решить эту проблему, используя следующий эффективный код:

$resultArray = str_getcsv($csv, PHP_EOL);//parse the rows 
    array_shift($resultArray);//shift out results first row: date info 
    $rowFieldKeysArray = str_getcsv(array_shift($resultArray), ",");//shift out results new first row: field labels into field key name array 
    //array('date', 'time', 'label', 'artist', 'composer', 'album', 'title', 'duration');//array of Key field names for associative array 
    //  [0]  [1]  [2]  [3]  [4]  [5]  [6]  [7]  //key index 
    foreach($resultArray as &$row) {//parse the items in rows 
     $row = array_combine($rowFieldKeysArray, str_getcsv($row, ",", '"'));//array_combine replaces numeric indexes with key field labels 
    }//foreach 

Спасибо!

+0

@ Андрей: Ваша ссылка была наиболее полезной, и я решил эту проблему, используя эту информацию. Если вы опубликуете это как ответ, я бы принял его. – BartmanEH

+0

Пожалуйста, обратитесь к аналогичной теме: http://stackoverflow.com/questions/29711088/reading-csv-into-a-php-array/29711416#29711416 –

+0

Невозможно опубликовать его как ответ по какой-либо причине. Все хорошо, я рад, что это помогает. –

ответ

3

Это может помочь вам

Script - Для CSV в массив из файла

[[email protected] tmp]$ cat test.php 
<?php 

function csv_to_array($filename='', $delimiter=',') 
{ 
    if(!file_exists($filename) || !is_readable($filename)) 
     return FALSE; 

    $header = NULL; 
    $data = array(); 
    if (($handle = fopen($filename, 'r')) !== FALSE) 
    { 
     while (($row = fgetcsv($handle, 0, $delimiter)) !== FALSE) 
     { 

      if(!$header) 
      { 
       $header = $row; 
      } 
      else 
      { 
       if(count($header)!=count($row)){ continue; } 

       $data[] = array_combine($header, $row); 
      } 
     } 
     fclose($handle); 
    } 
    return $data; 
} 

print_r(csv_to_array("/tmp/test.csv")); 

?> 

Script - Для CSV на массив из строки

[[email protected] tmp]$ cat test.php 
<?php 

function str_to_csv_to_array($string, $delimiter=',') 
{ 
     $header = NULL; 
     $data = array(); 
     $rows = explode(PHP_EOL, $string); 
     foreach($rows as $row_str) 
     { 
      $row = str_getcsv($row_str); 
      if(!$header) 
      { 
       $header = $row; 
      } 
      else 
      { 
       if(count($header)!=count($row)){ continue; } 

       $data[] = array_combine($header, $row); 
      } 
     } 

    return $data; 
} 


$string = <<<EOF 
date,time,label,artist,composer,album,title,duration 
2015-06-16,12:00 AM,Island,U2,"Clayton- Adam,The Edge,Bono,Mullen- Larry- Jr",Songs Of Innocence,SONG FOR SOMEONE,03:46 
2015-06-16,12:04 AM,Lowden Proud,"Fearing & White, Andy White, Stephen Fearing","White- Andy,Fearing- Stephen",Tea And Confidences,SECRET OF A LONG LASTING LOVE,03:10 
2015-06-16,12:07 AM,Columbia,The Wallflowers,"Dylan- Jakob,Irons- Jack,Mathis- Stuart,Richling- Greg,Jaffee- Rami",Glad All Over,REBOOT THE MISSION,03:31 
2015-06-16,12:10 AM,Distort Light,Bend Sinister,Moxon- Daniel,"Stories Of Brothers, Tales Of Lovers",JIMMY BROWN,03:48 
EOF; 

print_r(str_to_csv_to_array($string)); 
?> 

входного файла

[[email protected] tmp]$ cat test.csv 
date,time,label,artist,composer,album,title,duration 
2015-06-16,12:00 AM,Island,U2,"Clayton- Adam,The Edge,Bono,Mullen- Larry- Jr",Songs Of Innocence,SONG FOR SOMEONE,03:46 
2015-06-16,12:04 AM,Lowden Proud,"Fearing & White, Andy White, Stephen Fearing","White- Andy,Fearing- Stephen",Tea And Confidences,SECRET OF A LONG LASTING LOVE,03:10 
2015-06-16,12:07 AM,Columbia,The Wallflowers,"Dylan- Jakob,Irons- Jack,Mathis- Stuart,Richling- Greg,Jaffee- Rami",Glad All Over,REBOOT THE MISSION,03:31 
2015-06-16,12:10 AM,Distort Light,Bend Sinister,Moxon- Daniel,"Stories Of Brothers, Tales Of Lovers",JIMMY BROWN,03:48 

Оба сценария будет выводить

[[email protected] tmp]$ php test.php 
Array 
(
    [0] => Array 
     (
      [date] => 2015-06-16 
      [time] => 12:00 AM 
      [label] => Island 
      [artist] => U2 
      [composer] => Clayton- Adam,The Edge,Bono,Mullen- Larry- Jr 
      [album] => Songs Of Innocence 
      [title] => SONG FOR SOMEONE 
      [duration] => 03:46 
     ) 

    [1] => Array 
     (
      [date] => 2015-06-16 
      [time] => 12:04 AM 
      [label] => Lowden Proud 
      [artist] => Fearing & White, Andy White, Stephen Fearing 
      [composer] => White- Andy,Fearing- Stephen 
      [album] => Tea And Confidences 
      [title] => SECRET OF A LONG LASTING LOVE 
      [duration] => 03:10 
     ) 

    [2] => Array 
     (
      [date] => 2015-06-16 
      [time] => 12:07 AM 
      [label] => Columbia 
      [artist] => The Wallflowers 
      [composer] => Dylan- Jakob,Irons- Jack,Mathis- Stuart,Richling- Greg,Jaffee- Rami 
      [album] => Glad All Over 
      [title] => REBOOT THE MISSION 
      [duration] => 03:31 
     ) 

    [3] => Array 
     (
      [date] => 2015-06-16 
      [time] => 12:10 AM 
      [label] => Distort Light 
      [artist] => Bend Sinister 
      [composer] => Moxon- Daniel 
      [album] => Stories Of Brothers, Tales Of Lovers 
      [title] => JIMMY BROWN 
      [duration] => 03:48 
     ) 

) 
+1

Это очень всеобъемлющий ответ и почти идеальный, за исключением того, что он работает на csv-файле, а не на строке csv, как первоначально запрашивалось. Я думаю, что я могу преобразовать его, чтобы использовать str_getcsv вместо fgetcsv, поэтому я буду отмечать это как ответ. – BartmanEH

+0

Да, вы можете так конвертировать, в противном случае использовать функцию explode сначала использовать символ новой строки, который дает вам массив строк, а затем применять функцию разрыва в каждой строке, которая дает массив столбцов. В настоящее время я на мобильный Интернет завтра утром, когда я добираюсь до офиса I ответ обновления для строки –

+0

@BartmanEH Обновленный ответ, пожалуйста, загляните в него –

Смежные вопросы