2015-03-13 4 views
-1

Не думайте, что это сложно, но после тяжелого рабочего дня я не могу справиться с этой тривиальной проблемой. У меня есть простой CSV-файл, который я должен показать через php, группируя строки со значения столбца. Едем именно:PHP: группировка строк csv при определенном значении

Это мой CSV файл:

15000,art1,black 
15000,art1,white 
15000,art1,green 
20000,art2,black 
20000,art2,white 
25000,art3,black 

И это то, что я хочу, чтобы напечатать:

15000-art1-black 
15000-art1-white 
15000-art1-green 
--- Found black,white,green --- 
20000-art2-black 
20000-art2-white 
--- Found balck,white --- 
25000-art3-black 
--- Found black --- 

Моя точка такова:

<?php 
$Export= fopen("Test.csv", "r"); 
while(!feof ($Export)){ 
    $riga=fgets($Export, 4096); 
    if($riga!=""){ 
     $data=split(',',$riga); 
     foreach ($data as $line) { 
      $val = explode(",", $line); 
      $code  = $val[0]; 
      $art_n  = $val[1]; 
      $color  = $val[2]; 
     } 
    } 
} 
fclose($Export); 
?> 
+0

поставил весь свой источник. вам нужно сначала поместить каждую строку в массив, а затем взорвать запятую, следующей за ее заменой, и, наконец, вычислить появления для отображения --- Найден правильно. – unixmiah

+0

Не могли бы вы привести мне пример? –

ответ

1
<?php 

if (($handle = fopen("Test.csv", "r"))) { 
    $lines = array(); 
    while (($columns = fgetcsv($handle))) { 

     $number = $columns[0]; 
     $colour = $columns[2]; 

     if (!isset($lines[$number])) { 
      $lines[$number] = array('instances' => array(), 'colours' => array()); 
     } 

     $lines[$number]['instances'][] = $columns; 
     $lines[$number]['colours'][$colour] = 1; 
    } 

    fclose($handle); 

    foreach ($lines as $number => $line) { 
     foreach ($line['instances'] as $instance) { 
      echo implode('-', $instance) . "\n"; 
     } 
     echo "--- Found " . implode(',', array_keys($line['colours'])) . " ---\n"; 
    } 
} 

Выход:

15000-art1-black 
15000-art1-white 
15000-art1-green 
--- Found black,white,green --- 
20000-art2-black 
20000-art2-white 
--- Found black,white --- 
25000-art3-black 
--- Found black --- 
+0

Спасибо, Роббм! –

0

Вот измененная версия вашего php-кода, выполняющего то, что вы хотите:

<?php 
$Export= fopen("Test.csv", "r"); 
$found=array(); 
$lastart=""; 
while(!feof ($Export)){ 
    $riga=fgets($Export, 4096); 
    $riga = str_replace(PHP_EOL, '', $riga); 
    if($riga!=""){ 
      $val = explode(",", $riga); 
      $code  = $val[0]; 
      $art_n  = $val[1]; 
      if ($lastart != $art_n && $lastart != "") { 
        foreach ($found as $col) { 
          @$colorfound.=$col.","; 
        } 
        $colorfound = rtrim($colorfound, ","); 
        echo "--- Found $colorfound ---\n"; 
        unset ($found); 
        $colorfound = ""; 
      } 
      $color  = $val[2]; 
      $found[] = $color; 
      echo "$code-$art_n-$color\n"; 
      $lastart = $art_n; 
    } 
} 
//The last art_n 
foreach ($found as $col) { 
     @$colorfound.=$col.","; 
} 
$colorfound = rtrim($colorfound, ","); 
echo "--- Found $colorfound ---\n"; 
fclose($Export); 
?>