2009-10-29 14 views
0

修剪字符串变量我看到另一篇文章使用此语句修剪数组中包含的字符串变量提示:引用在PHP5

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

然而,如果摆在首位,该字符串不包含在数组,我想有一个可以这样使用的微调功能:

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

我试着写这样的功能:

function trimAll() { 

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

但是没有成功,函数返回后字符串变量不会被修剪。

为什么以及如何做到这一点?

+0

你需要做'trimAll($ A,&$b);'[PHP?:参照可变长度参数列表]的 – alex

+0

可能重复?(http://stackoverflow.com/questions/1925253/php-variable-length-argument-list-by-reference) – newacct

回答

4

您不能通过引用传递可变数量的参数。作为一种变通方法,尝试像

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

更好,改写段,这样它不需要使用一组变量,这是一个坏主意,反正

0

您是否尝试过通过引用传入变量。

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

致电时间通过引用(你建议的)在PHP 5中已被弃用。 – ken

+0

@ken非常感谢你的信息 – bobo

+0

我知道它的折旧,但它不是唯一的方式,他可以做他想做的事情,除非有一种方法可以声明一个方法的所有属性(未知数)将通过ref –

1

我不认为你可以通过引用传递参数的可变长度列表。

您可以传入参考数组。

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

...并适当修改您的调用来创建引用数组。

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

如果你添加前缀参数$ array在函数trimAll中加上&,然后你就可以正常使用它了 – alex

+2

删除&旁边的修剪btw。 – lemon

+0

它不会,它抱怨致命错误:只有变量可以传递通过引用第15行 http://codepad.org/FItzMVjn – bobo

2

这也适用,但可能会令任何人都可能会出现沮丧作为其非常直观的工作:

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

这工作,但使用呼叫时传递的引用,这是在弃用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";