1

fgetcsvを使用して、特に$line_of_textを使用してCSVファイルを解析しています。国を共有しているすべての都市をエコーし​​たいのですが、都市の重複を排除して、たとえば、パリが200回発生した場合、フランスの他の異なる都市の1つのエコーに沿って、1回だけエコーされるようにします。それらのインスタンス数の。

私の勘では、都市の値を配列に格納してから、array_uniqueを使用して重複を削除する必要がありますが、残念ながら、これは現在のphpの能力を超えています。どんな助けでも深く感謝します、私は私の力ですべてを試しました!

<?php
  $display = 100;
  $counter = 1;
  $country = $_GET['country'];
  echo "<ol>";
  $file_handle = fopen("csv/file.csv", "r");
  while (($line_of_text = fgetcsv($file_handle, 1024, ",")) !== false) {
      if ($line_of_text[13] == $country) {
          echo "<li>City:" . $line_of_text[15]) . "</li>";

          $counter++;
          if ($counter == $display) {
              break;
              echo "</ol>";
          }
      }
  }
  fclose($file_handle);
?>
4

2 に答える 2

2

コードを少し単純化できます。

// read in file
$csv = array_map("str_getcsv", file("csv/file.csv"));
$cities = array();

// loop for countries
foreach ($csv as $line) {
    if ($line[13] == $country) {
        $cities[] = $line[15];    // append to new array
    }
}

// unique cities
$cities = array_unique($cities);
$cities = array_slice($cities, 0, 100);   // max 100

// output
foreach ($cities as $name) { print "<li>City: $name</li>"; }

このように、処理ロジックと出力を分離しておく必要があります。

于 2011-05-09T00:57:04.343 に答える
1

メモリから作業するだけで、次のようなものを試してください

<?php
  $display = 100;
  $counter = 1;
  $country = $_GET['country'];
  $storedcountries = array();//Store countries that have already been read
  echo "<ol>";
  $file_handle = fopen("csv/file.csv", "r");
  while (($line_of_text = fgetcsv($file_handle, 1024, ",")) !== false) {
      if ($line_of_text[13] == $country && !in_array($storedcountries, $line_of_text[13]) {//Make sure the country is not already stored in the $storedcountries array
          echo "<li>City:" . $line_of_text[15]) . "</li>";

          $counter++;
          if ($counter == $display) {
              break;
              echo "</ol>";
          }
          $storedcountries[] = $line_of_text[15];
      }
  }
  fclose($file_handle);
?>
于 2011-05-09T00:52:30.387 に答える