[英]Expand comma separated array items into separate array item
我有一个CSV文件,正在解析为一个关联数组,需要将其保存在数据库中。 问题是我的某些CSV列包含其他CSV值,我需要将其分别插入数据库中。 示例讲得更好,所以这里去:
ID, Col1, Col2
1, "Example 1.1.1,Example 1.1.2", Example 1.2
2, Example 2.1, "Example 2.2.1, Example 2.2.2"
如您所见,第一行第一行有2个值,第二行第二行有2个值。
我不知何故需要使它们扩展为4个单独的数组项,如下所示:
array(
[0] => array( "ID" => 1, "Col1" => "Example 1.1.1", "Col2" => "Example 1.2" ),
[1] => array( "ID" => 1, "Col1" => "Example 1.1.2", "Col2" => "Example 1.2" ),
[2] => array( "ID" => 2, "Col1" => "Example 2.1", "Col2" => "Example 2.2.1" )
[3] => array( "ID" => 2, "Col1" => "Example 2.1", "Col2" => "Example 2.2.2" )
)
PHP中是否有一个功能可以做到这一点,还是我必须遍历整个过程?
该方法:
该代码应能很好地处理您提供的数据,但在以下情况下可能无法使用:
ID, Col1, Col2
1, "Example 1.1.1,Example 1.1.2", "Example 1.2"
2, Example 2.1, "Example 2.2.1, Example 2.2.2"
一行中包含超过CSV字符串可能会破坏它。 我没有太多时间来测试所有可能性。
这是代码:
$file = @fopen("file.csv", "r");
$major_arr = array();
$headers_array = array();
$iterator = 0;
$total_cols = 0;
if(!empty($file)){
while(! feof($file)){
$major_line_arr = array();
$line_str = fgetcsv($file);
if($iterator == 0){
// First Line
// Read headers
$headers_array = explode(",", $line_str);
// Trim the whitespace in the array
$headers_array = array_map('trim', $headers_array);
$total_cols = sizeof($headers_array);
} else {
// Search for text within double quotes
$text_btw_double_quotes_arr = array();
if(preg_match('/"([^"]+)"/', $line_str, $m)){
array_push($text_btw_double_quotes_arr, $m[1]);
}
// Remove this text from the original line
$new_line_str = $line_str;
if(!empty($text_btw_double_quotes_arr)){
for($i=0; $i<sizeof($text_btw_double_quotes_arr); $i++){
$new_line_str = str_replace($text_btw_double_quotes_arr[$i], "", $new_line_str);
$major_line_arr = array();
$double_quoted_term = $text_btw_double_quotes_arr[$i];
$major_line_arr_tmp = array();
for($j=0; $j<$total_cols; $j++){
array_push($major_line_arr_tmp, $csv_columns_arr[$j]);
}
// Build the Major Line array
if(!empty($headers_array)){
for($j=0; $j<sizeof($headers_array); $j++){
$header_title = $headers_array[$j];
$value = $major_line_arr_tmp[$j];
if($value == ''){
$value = $double_quoted_term;
}
$new_arr = array($header_title => $value);
array_push($major_line_arr, $new_arr);
}
}
// Add the Major Line to the Major array
array_push($major_arr, $major_line_arr);
}
} else {
$major_line_arr_tmp = array();
for($i=0; $i<$total_cols; $i++){
array_push($major_line_arr_tmp, $csv_columns_arr[$i]);
}
// Build the Major Line array
if(!empty($headers_array)){
for($i=0; $i<sizeof($headers_array); $i++){
$header_title = $headers_array[$i];
$value = $major_line_arr_tmp[$i];
$new_arr = array($header_title => $value);
array_push($major_line_arr, $new_arr);
}
}
// Add the Major Line to the Major array
array_push($major_arr, $major_line_arr);
}
}
$iterator++;
}
fclose($file);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.