在PHP5中通过引用修剪字符串变量

时间:2009-10-29 00:49:11

标签: php string pass-by-reference trim

我看到另一篇文章建议使用此语句来修剪数组中包含的字符串变量:

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

但是,如果首先,字符串不包含在数组中,我希望有一个可以像这样使用的trim函数:

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

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

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

6 个答案:

答案 0 :(得分:4)

您不能通过引用传递可变数量的参数。作为解决方法,请尝试类似

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

更好的是,重写代码片段以便它不需要使用一堆变量,这无论如何都是个坏主意

答案 1 :(得分:2)

这也有效,但很可能会让任何可能碰巧沮丧的人因为非常不直观而感到沮丧:

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

答案 2 :(得分:1)

我认为你不能通过引用传递一个可变长度的args列表。

您可以传入一系列参考文献。

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

答案 3 :(得分:1)

我不相信使用func_get_args这是可能的,尽管对它的PHP手册页的评论提出了一种可能的替代解决方案:http://uk3.php.net/manual/en/function.func-get-args.php#90095

然而,user187291的解决方法看起来更简单。

答案 4 :(得分:0)

您是否尝试通过参考传递变量。

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

答案 5 :(得分: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";