0

PHPには配列があります。そのように設定されています

$array_var = array(array(1,2,3,4), array(5,6,7,8), array(3,5,3,9));

この配列は、fgetcsv関数を使用して取得したcsvファイルからのものです。配列を適切にエコーアウトしてその内容を表示する場合は、次のように表示されます。

field1  field2  field3  field4
  1       2       3       4
  5       6       7       8
  3       5       3       9

などなど。

次に、この配列を並べ替えます。ただし、すべての配列の1つの列のみを並べ替えたいと思います。別の言い方をすれば、たとえば、メイン配列内のすべての配列の3つおきの値を取得し、それらをアルファベット順に昇順でリストしたいとします。したがって、特定のケースでは、上記の表からfield3のすべての値を取得し、それを並べ替えます。また、並べ替えの最終結果が列を再配置して、値と正しく整列するようにします。

最終結果

field1  field2  field3  field4
  1       2       3       4
  3       5       3       9
  5       6       7       8

などなど。

これはどのように達成できますか?

チャレンジの理由は、csvファイルの単一の列から重複を削除しようとしているためです。これを行う最も速い方法は、値を並べ替えて範囲内で一致するものを探すことだと思います。

4

1 に答える 1

2

説明から外していることがあるので、正確な答えを出すのは難しいです。たとえば、列の1つで並べ替えられているが、他の列とは異なる行を内部で並べ替えるにはどうすればよいでしょうか。それらを他の列で並べ替える必要がありますか、元の順序のままにする必要がありますか、それとも任意の順序で配置することができますか?

私があなたの質問を解釈する方法を考えると、私はおそらく比較のために私自身のクラスを定義するでしょう。

<?php
class ColumnCompare {
  function __construct($column) {
    $this->column = $column;
  }

  function compare($a, $b) {
    if ($a[$this->column] == $b[$this->column]) {
      return 0;
    }
    return ($a[$this->column] < $b[$this->column]) ? -1 : 1;
  }
}

// Hard-coded input
$array_var = array(array(1,2,3,4), array(5,6,7,8), array(3,5,3,9));
$sort_by_col = 2;

// Create object for sorting by a particular column
$obj = new ColumnCompare($sort_by_col);
usort($array_var, array($obj, 'compare'));

// Write CSV to standard output
$sout = fopen('php://stdout', 'w');
foreach ($array_var as $fields) {
  fputcsv($sout, $fields);
}
fclose($sout);
?>

結局、あなたは別の質問を投げかけますが、それは答えることが不可能です。単一の列から重複を削除すると、残りの行で何が起こると思われますか?1行だけを保持する必要があります。その場合、どちらの行を保持しますか?「重複を削除する」とは、値を削除してその位置にNULLを配置することを意味する場合もあります。その特定の問題を解決したい場合は、いくつかの詳細を提供する必要があります。

CSVファイルが非常に単純で、重複する行のすべての値が同一である場合(編集前の例の場合)、次のようなコマンドを簡単に実行できます。

sort myfile.csv | uniq

でもそれよりももっと複雑な気がします。uniqたとえば、重複した行のみを返す設定もあります。各行から特定の列を取得して操作するコマンドを作成することもできます。しかし、私が言ったように、それ以上の情報なしにそのようなコマンドを構築することは不可能です。

于 2012-07-25T14:26:14.750 に答える