2014-07-20 5 views
0

Je crée une classe PHP qui manipule les fichiers csv. Dans le cadre de la classe, j'ai une fonction qui permet de filtrer les données showOnlyWhere. Cependant, j'obtiens cette erreur Invalid argument supplied for foreach() sur la ligne 331 (la ligne avec l'instruction foreach). J'ai essayé d'ajouter global $arr; mais cela n'a pas fonctionné. Comment pourrais-je le réparer?Filtrage d'un tableau multidimensionnel basé sur un autre tableau

$this -> rows est un tableau multidimensionnel contenant toutes les données csv.

$arr est au format:

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

ci-dessous est la fonction 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;  
} 

Je pense que l'erreur pourrait avoir quelque chose à voir avec la fonction Anonymous - mais je ne suis pas vraiment sûr .

+0

Im filtrant '$ rows' – jamesmstone

Répondre

2

au lieu d'utiliser global $arr vous pouvez faire $arr à la disposition de la fonction anonyme 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; 
}; 

Aussi, je remarquai que vous assignez $rows = $this->filteredRows; avant peuplez $this->filteredRows. Je ne suis pas sûr que ce soit intentionnel?

0

Le format de votre $ arr est incorrect.

cela est faux:

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

Vous ne pouvez pas fournir des objets de classe à foreach, il devrait être un tableau valide.

Il devrait ressembler à ceci:

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

Alors d'abord convertir votre objet à un tableau valide.

Questions connexes