【问题标题】:PHP: Working with array_filterPHP:使用 array_filter
【发布时间】:2012-11-26 23:58:29
【问题描述】:

这实际上与我之前问的一个问题有关

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

代码如何找到匹配值的所有索引,将它们放入一个数组中,该数组的键是索引所关联的值?

这就像我看不到重复值的整个搜索。

【问题讨论】:

    标签: php arrays callback


    【解决方案1】:

    array_filter 中的回调应返回 truefalse。如果它返回true,那么这意味着应该保留当前值。如果返回false,那么当前值应该被丢弃。

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

    【讨论】:

    • 我对这个过程的了解就这么多了。这更多地与上面示例中如何使用该函数来检索具有重复值的行有关;我不完全确定在我发布的示例中它是如何做到的。
    • 好吧,由于该函数旨在查找具有重复项的行,因此它需要过滤以查找计数中包含多个行的行。
    • 我可以看到它正在这样做,但我不知道它是如何做到的。这是我试图理解的过程。它如何检查重复值?通过查看代码,我没有看到从数组 -> 到搜索 -> 查找重复值的程序过程。 array_filter 如何搜索数组?它不能像循环一样遍历它。
    • 这正是array_filter 所做的。它遍历您的源数组,并根据回调返回的内容构建一个新数组。
    • 我了解 array_filter 在做什么,但我不明白它是如何做到的。代码的原始发布者 Jon 写道; “此代码将返回一个数组,其中键是 CSV 数据中的值,值是数组,其中每个值出现的行的索引从零开始。”这是我不明白的;它是如何达到 $values 的值是数组的值,该数组具有每个值出现的行的从零开始的索引。代码如何找到每个值出现的每一行的索引,并将其放入存储在 $values 中的数组中?
    猜你喜欢
    • 2021-10-02
    • 2011-07-25
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多