2009-10-29 18 views
0

j'ai vu un autre poste qui suggère utiliser cette instruction pour couper les variables de chaîne contenues dans le tableau:Recadrage variables de chaîne par référence dans PHP5

$_POST=array_map('trim', $_POST); 

Cependant, si en premier lieu, les chaînes ne sont pas contenues dans un tableau , je voudrais avoir une fonction de coupe qui peut être utilisé comme ceci:

$a=' aaa '; 
$b=' bbb '; 
$c=' ccc '; 
trimAll($a,$b,$c); //arbitrary number of string variables can be passed 

J'ai essayé d'écrire une fonction comme ceci:

function trimAll() { 

    $args = &func_get_args(); 
    foreach($args as &$arg) { 
     if(isset($arg) && is_string($arg)) 
      $arg=&trim($arg); 
    } 
     //no return value is required 
} 

Mais sans succès, les variables de chaîne ne sont pas tronquées après le retour de la fonction. Pourquoi et comment cela peut-il être fait?

+0

Est-ce que vous devez faire 'SupprimerTout (& $ a, &$b);' – alex

+0

double possible de [PHP: liste des arguments de longueur variable par référence]? (http://stackoverflow.com/questions/1925253/php-variable-longueur-argument-list-by-reference) – newacct

Répondre

4

Vous ne pouvez pas transmettre un nombre variable de paramètres par référence. Pour contourner ce problème, essayez quelque chose comme

list($a, $b, $c) = array_map('trim', array($a, $b, $c)); 

mieux encore, réécrire l'extrait de sorte qu'il ne nécessite pas d'utiliser un tas de variables, ce qui est une mauvaise idée de toute façon

0

Avez-vous essayé de passer les variables par référence.

trimAll(&$a,&$b,&$c) 
+1

Appel Le temps passé par référence (ce que vous suggérez) est obsolète en PHP 5. – ken

+0

@ken je vous remercie beaucoup pour vos informations – bobo

+0

Je sais que c'est déprécié, mais n'est-ce pas aussi la seule façon dont il peut faire ce qu'il veut à moins il y a un moyen de déclarer que toutes les propriétés (nombre inconnu de) d'une méthode seront passées parref –

1

Je ne pense pas que vous pouvez passer une liste d'args de longueur variable par référence.

Vous pouvez passer un tableau de références.

function trimAll($array) { 
    foreach($array as $k => $v) { 
     if(isset($array[$k]) && is_string($array[$k])) 
      $array[$k]=&trim($array[$k]); 
    } 
} 

... et de modifier de manière appropriée votre appel pour créer un tableau de références.

$a=' aaa '; 
$b=' bbb '; 
$c=' ccc '; 
trimAll(array(&$a,&$b,&$c)); 
+0

Si vous ajoutez le préfixe argument $ array dans la fonction trimAll avec &, cela vous permettra alors de l'utiliser normalement – alex

+2

Supprimer & à côté de trim btw. – lemon

+0

Il ne sera pas, il se plaint Erreur fatale: Seules les variables peuvent être transmises par référence sur la ligne 15 http://codepad.org/FItzMVjn – bobo

1

Je ne suis pas convaincu que Ceci est possible en utilisant func_get_args, bien qu'un commentaire sur sa page de manuel PHP suggère une solution alternative possible: http://uk3.php.net/manual/en/function.func-get-args.php#90095

Cependant, la solution de contournement de user187291 est beaucoup plus simple.

+0

oui, mais il faut passer par référence au temps de référence, ce qui est obsolète – newacct

2

Cela fonctionne aussi, mais feront probablement quelqu'un que vous pourriez arriver à travailler avec frustré comme très unintuitive:

// pass variables by string name 
extract(array_map('trim', compact('a', 'b', 'c'))); 
0

Cela fonctionne, mais utilise le passage par référence temps d'appel, qui est désapprouvée dans PHP 5.3:

function trimAll() { 
    $backtrace = debug_backtrace(); 
    foreach($backtrace[0]['args'] as &$arg) 
     if(isset($arg) && is_string($arg)) 
      $arg=trim($arg); 
} 
$a=' aaa '; 
$b=' bbb '; 
$c=' ccc '; 
trimAll(&$a,&$b,&$c); 
echo "$a\n"; 
echo "$b\n"; 
echo "$c\n";