dousilie9522
2014-07-20 02:54
浏览 57
已采纳

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

I'm creating a PHP class that manipulates csv files. As part of the class I have a function that allows the data to be filtered showOnlyWhere. However I get this error Invalid argument supplied for foreach() on line 331 (the line with the foreach statement). I tried adding global $arr; but that didn't work. How would i fix it?

$this -> rows is a multi-dimensional array that contains all the csv data.

$arr is in the format:

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

Below is the showOnlyWhere function

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;    
}

I think the error might have something to do with the Anonymous function - but I'm not really sure.

图片转代码服务由CSDN问答提供 功能建议

我正在创建一个操纵csv文件的PHP类。 作为类的一部分,我有一个允许的函数 要过滤的数据 showOnlyWhere 。 但是我得到了这个错误第331行(带有 foreach 语句的行)为foreach()提供的无效参数。 我尝试添加 global $ arr; ,但这不起作用。 我该如何解决?

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

$ arr 的格式为:

  $ key => $ val array(
  $ key =列名
 $ val =该列应包含的值
)
   
 
 

下面是 showOnlyWhere 函数

  function showOnlyWhere($ arr)
 {
 
 if if($ this-> showOnlyWhere == true){
 $ rows = $ this-> filteredRows; \  n} 
其他{
 $ rows = $ this-> rows; 
} 
 
 $ filter = function($ item){
 global $ arr;  //没有工作
 foreach($ arr as $ chkCol => $ chkVal){
 if($ item [$ arr [$ chkCol]]!= $ chkVal){
 return false; 
 break  (3); 
} 
} 
返回true; 
}; 
 
 
 $ this-> filteredRows = array_filter($ rows,$ filter);  
 
 
 $ this-> showOnlyWhere = true;  
} 
   
 
 

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

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • douwei3280 2014-07-20 03:00
    已采纳

    instead of using global $arr you can make $arr available to the anonymous function via 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;
    };
    

    Also, I noticed that you are assigning $rows = $this->filteredRows; before you populate $this->filteredRows. I'm not sure if that's intentional?

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • dongwo1914 2014-07-20 03:05

    Format for your $arr is wrong.

    this is wrong:

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

    You cannot supply class objects to foreach, it should be a valid array.

    It should be like this:

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

    So first convert your object to a valid array.

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题