2012-11-26 44 views
0

這實際上涉及到一個先前的問題,我詢問有人提供了一些我可以使用的代碼作爲我提出的問題的解決方案。PHP:使用array_filter

現在,我瞭解了大部分發布的代碼,直到我找到array_filter用於檢索重複行的位置。

作爲參考,這是我提出的上一個問題; PHP: Searching through a CSV file the OOP way

這是我很難完全理解發生了什麼;

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; 

我不明白比較運算符在返回值時的行爲如何;是說只有在超過1行時才返回TRUE,然後array_filter正在評估那個TRUE語句並返回與它相關的值?

在函數($ 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; 

如何在代碼中找到了匹配值的所有索引,把那些在數組,其中該數組的關鍵是值這些指標與?

這就像一個重複值的整體搜索正在進行,我看不到。

回答

0

array_filter中的回調應返回truefalse。如果返回true,則表示應保留當前值。如果返回false,則應丟棄當前值。

將數組的每個值作爲第一個參數傳遞給回調函數(本例中爲$row),然後由回調函數決定是否保留該值。

+0

我對這個過程有所瞭解。這與上面的例子中如何使用函數來檢索具有重複值的行有關。我並不完全確定在我發佈的示例中它是如何實現的。 –

+0

那麼,由於該函數旨在查找具有重複項的行,因此需要過濾以查找計數中具有多個項的行。 –

+0

我可以看到它正在這樣做,但我不知道它是如何做到的。這是我試圖理解的過程。它如何檢查重複值?從查看代碼,我沒有看到從數組 - >到搜索 - >的程序過程,以找到重複的值。 array_filter如何搜索數組?它不能像循環一樣迭代它。 –