这实际上与我之前询问的一个问题有关,在哪里有人好心地提供了一些我可以使用的代码作为我提出的问题的解决方案。
现在,我了解了大部分已发布的代码,直到我了解使用 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;
我不明白返回值时比较运算符的行为方式;是不是说只有在多于 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;
代码如何找到匹配值的所有索引,将它们放入一个数组中,该数组的键是索引相关的值?
就像我看不到重复值的整个搜索一样。