根据另一个数组过滤多维数组

时间:2014-07-20 02:54:21

标签: php arrays csv filter anonymous-function

我正在创建一个操纵csv文件的PHP类。 作为课程的一部分,我有一个允许过滤数据的函数showOnlyWhere。但是我在第331行(带有Invalid argument supplied for foreach()语句的行)上收到此错误foreach。我尝试添加global $arr;,但这不起作用。我该如何解决?

$this -> rows是一个包含所有csv数据的多维数组。

$arr的格式为:

$key=>$val array(
$key = Column Name
$val = value that column should contain
)

以下是showOnlyWhere功能

function showOnlyWhere($arr)
    {

                if($this->showOnlyWhere == true){
                    $rows = $this->filteredRows;
                }
                else{
                    $rows = $this->rows;
                }

                $filter = function ($item){
                        global $arr; // didn't work
                        foreach($arr as $chkCol => $chkVal){
                            if ($item[$arr[$chkCol]] != $chkVal ){
                                return false;
                                break(3);
                            }                      
                        }
                        return true;
                    };


                $this->filteredRows = array_filter($rows,$filter);                  


                $this->showOnlyWhere = true;    
}

我认为错误可能与匿名功能有关 - 但我不太确定。

2 个答案:

答案 0 :(得分:2)

而不是使用global $arr,您可以通过$arr

向匿名函数提供use
$filter = function ($item) use ($arr) {
    //global $arr; // didn't work
    foreach($arr as $chkCol => $chkVal){
        if ($item[$arr[$chkCol]] != $chkVal ){
            return false;
        }                      
    }
    return true;
};

此外,我注意到您在填充$rows = $this->filteredRows;之前指定了$this->filteredRows。我不确定这是否是故意的?

答案 1 :(得分:0)

$ arr的格式错误。

这是错误的:

$key=>$val array(
$key = Column Name
$val = value that column should contain
)

你不能为foreach提供类对象,它应该是一个有效的数组。

应该是这样的:

$arr=array(
$key => 'Column Name',
$val = 'value that column should contain'
);

首先将对象转换为有效数组。