2010-12-10 5 views
3

J'ai une simple fonction de nettoyage wee en PHPforeach - boucle à travers l'objet et l'évolution des valeurs - php5

Il prend une valeur ou un tableau de valeurs et fait un peu de nettoyage d'entrée. Maintenant, je suis en utilisant mysqli qui est de récupérer les lignes comme des objets, donc je dois pouvoir l'appliquer à obejcts ainsi que des tableaux

function filter_out($output=''){ 
    if($output != ''){ 
     // i.e passed $_POST array 
     if(is_array($output)){ 
      $newoutput = array(); 
      foreach($output as $outputname=>$outputval){ 
       $newoutput[$outputname] = stripslashes($outputval); 
       $newoutput[$outputname] = htmlspecialchars($newoutput[$outputname]); 
      } 
     } else if(is_object($input)){ 
      ? 
     } 
    } 
} 

Quelqu'un peut-il me dire comment je peux faire l'équivalent avec un objet en entrée?

Répondre

3

La fonction que vous cherchez est get_object_vars:

$vars = get_object_vars($input); 
foreach ($vars as $outputname => $outputval) { 
    ///... 
} 

Ne pas essayer itérer sur l'objet lui-même (foreach ($object as $key => $value)), parce que cela ne fonctionnera pas toujours raison. Parfois, il (stdClass à titre d'exemple), et parfois il ne (toute classe implémentant Traversable ...

Modifier

En ce qui concerne votre commentaire va ... Tant que les classes Aren « t faire quoi que ce soit drôle (ou __get__set, protected ou private), vous pouvez faire:

$newoutput = clone $input; //make a copy to return 
$vars = get_object_vars($input); 
foreach ($vars as $outputname => $outputval) { 
    $newoutput->$outputname = htmlspecialchars(stripslashes($outputval)); 
} 

Mais je ne peux pas vraiment penser à une méthode qui fonctionne 100% du temps ... l'autre option , serait de revenir un objet Nieve (stdclass) au lieu du soumis un:

$newoutput = new StdClass(); 
$vars = get_object_vars($input); 
foreach ($vars as $outputname => $outputval) { 
    $newoutput->$outputname = htmlspecialchars(stripslashes($outputval)); 
} 
+0

Je ne suis pas sûr: « et parfois il a gagné 't (aucune classe implémentant Traversable ... ", n'entendiez-vous pas une classe ** non ** implémentant Traversable? A moins que vous ne vouliez dire que" travailler correctement "signifie obtenir toutes les propriétés publiques (par opposition à un comportement personnalisé)? – netcoder

+0

@netcoder: Non, ** a La mise en œuvre de la classe ny ... ** est correcte. Une classe qui implémente 'Traversable' modifiera le comportement de l'itération et renverra le plus souvent ** pas ** les propriétés de l'objet dans l'itération. –

+0

@Stefan: Heh, tout dépend de ce que veut dire votre définition de "droit de travail". ;-) Mais j'ai l'idée. – netcoder

0

Pour répondre à l'observation de l'OP sur ircmaxell's answer:

$vars = get_object_vars($input); 
foreach ($vars as $outputname => $outputval) { 
    $input->$outputname = htmlspecialchars(stripslashes($outputval)); 
} 
0

Puisque vous mentionnez tableaux et objet provenant de mysqli Je devine qu'ils » re juste stdClass alors pourquoi ne pas simplement jeter l'objet à un tableau?

$newoutput = array() 
foreach ((array) $output as $key => $value) { 
    $newoutput[$key] = htmlspecialchars(stripslashes($value)); 
} 

Ou vous pourriez probablement faire en place:

$output = (array) $output; 
foreach ($output as &$value) { 
    $value = htmlspecialchars(stripslashes($value)); 
} 

Ainsi, un flux unique pourrait ressembler à:

function filter_out($output=''){ 
    if($output != ''){ 
    // i.e passed $_POST array 
    $is_array = is_array($output); 
    $output = (array) $output; 
    foreach($output as &$outputval){ 
     $outputval = htmlspecialchars(stripslashes($outputval)); 
    } 
    if (!$is_array) { 
     $output = (object) $output; 
    } 
    } 
    return $output; 
} 
Questions connexes