从 PHP 中的 CSV 创建多维关联数组
create multidimensional associative array from CSV in PHP
我正在尝试在 PHP 中创建一个多维数组,其中内部数组与以下示例 CSV 字符串 $csv:
关联
# 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 string offset 'date'[...]"。
我该怎么做?
编辑:根据 Andrew 的评论中的 link 和我接受的答案中提供的组合信息,我能够使用以下高效代码解决此问题:
$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
谢谢!
这可能对您有所帮助
脚本 - 用于从文件
到数组的 csv
[akshay@localhost 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"));
?>
脚本 - 从字符串到数组的 csv
[akshay@localhost 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));
?>
输入文件
[akshay@localhost 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
两个脚本都会输出
[akshay@localhost 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
)
)
我正在尝试在 PHP 中创建一个多维数组,其中内部数组与以下示例 CSV 字符串 $csv:
关联# 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 string offset 'date'[...]"。
我该怎么做?
编辑:根据 Andrew 的评论中的 link 和我接受的答案中提供的组合信息,我能够使用以下高效代码解决此问题:
$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
谢谢!
这可能对您有所帮助
脚本 - 用于从文件
到数组的 csv[akshay@localhost 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"));
?>
脚本 - 从字符串到数组的 csv
[akshay@localhost 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));
?>
输入文件
[akshay@localhost 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
两个脚本都会输出
[akshay@localhost 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
)
)