1

これは実際、私が提起した問題の解決策として、誰かが私が使用できるコードを親切に提供してくれた、以前の質問に関連しています。

これで、投稿されたコードのほとんどを理解し、array_filter を使用して重複行を取得する場所にたどり着きました。

参考までに、これは私が提起した以前の質問です。PHP: OOP の方法で CSV ファイルを検索する

これは、何が起こっているのかを完全に理解するのが難しいところです。

public static function getRowsWithDuplicates($columnIndex) {
    $values = array();
    for ($i = 0; $i < $this->_dataSet->getRowCount(); ++$i) {
        $values[$this->_dataSet->->getValueAt($i, $columnIndex)][] = $i;
    }

    return array_filter($values, function($row) { return count($row) > 1; });
}

まず; そのコードを見ると、$values が連想配列のように見えます。もしそうなら、array_filter はどのように動作して、重複する値を持つ行を返しますか?

このコードを理解するために array_filter で何が起こっているかを完全に理解しているとは思いません。array_filter は、配列の各値をそのパラメーターで提供される関数に渡し、その関数から値を返すことを知っていますが、この特定の例では、array_filter 内で何が起こっているのかを正確に理解していないと思います。

上記のコードで何が起こっているのかをよりよく理解できるように、プロセスを段階的に理解できるレベルで誰かが説明してくれれば幸いです。結果を複製するだけではありません。

$values が連想配列の場合、連想配列のプロパティを利用して重複行を返すコードはどのようになっているのでしょうか?

私が理解するのが難しいのは、実際には関数自体ではなく、この特定のケースでどのように使用されているかだと思います。

return count($row) > 1;

値を返すときの比較演算子の動作がわかりません。複数の行がある場合にのみTRUEを返すと言っており、array_filterはそのTRUEステートメントを評価し、それに関連付けられた値を返しますか?

function($row) の $row には何が渡されていますか?

ご覧のとおり、回答よりも多くの質問があります。長い間推測して誤った結論に達するよりも、説明してもらいたいと思います。

$row は、 array_filter が配列値を反復処理で渡すために使用する単なるパラメーターですか?

編集:これは私の改訂された質問です。これはより具体的で、私が答えを探しているものです。

array_filter が何をしているのかはわかりますが、どのようにしているのかわかりません。コードの元の投稿者、Jon は次のように書いています。「このコードは、キーが CSV データの値であり、値が各値が表示される行のゼロベースのインデックスを持つ配列である配列を返します。」

これは私には理解できません。$values の値が、各値が表示される行のゼロベースのインデックスを持つ配列であるという点にどのように到達していますか。コードは、すべての値が表示される各行のインデックスをどのように見つけ、それを $values 内に格納された配列に入れるのでしょうか?

だから私の質問は、コードのこの部分に関連しています:

for ($i = 0; $i < $this->_dataSet->getRowCount(); ++$i) {
    $values[$this->_dataSet->->getValueAt($i, $columnIndex)][] = $i;

コードは、一致する値のすべてのインデックスをどのように見つけ、それらを配列に配置しますか?その配列のキーは、インデックスが関連する値です?

私には見えない重複値の検索が行われているようです。

4

1 に答える 1

0

のコールバックは、またはのいずれかarray_filterを返す必要があります。が返された場合は、現在の値を保持する必要があることを意味します。が返された場合は、現在の値を破棄する必要があります。truefalsetruefalse

配列の各値は最初の引数 ($rowこの場合) としてコールバック関数に渡され、値を保持するかどうかはコールバックによって決定されます。

于 2012-11-27T00:01:59.960 に答える