PHP:使用array_filter

时间:2012-11-26 23:58:30

标签: php arrays callback

这实际上与之前的一个问题有关,我问过哪些人提供了一些我可以使用的代码作为我提出的问题的解决方案。

现在,我了解了大部分发布的代码,直到我到达使用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;

代码如何找到匹配值的所有索引,将它们放在数组中,该数组的键是索引所涉及的值?

就像整个搜索重复值一样,我无法看到。

1 个答案:

答案 0 :(得分:0)

array_filter中的回调应返回truefalse。如果它返回true,则表示应保留当前值。如果它返回false,则应丢弃当前值。

数组的每个值作为第一个参数(在本例中为$row)传递给回调函数,然后由回调决定是否保留该值。