【问题标题】:Trimming string variables by reference in PHP5在 PHP5 中通过引用修剪字符串变量
【发布时间】:2010-12-11 02:14:51
【问题描述】:

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

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

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

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

【问题讨论】:

标签: php string pass-by-reference trim


【解决方案1】:

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

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

【讨论】:

  • 调用时间传递引用(你的建议)在 PHP 5 中被弃用了。
  • 我知道它已经贬值了,但这不是他可以做他想做的事情的唯一方法,除非有一种方法可以声明方法的所有(未知数量)属性都将通过引用传递
  • 这仍然无法与 trimAll 编写的函数一起使用(您尝试过吗?)
【解决方案2】:

我认为您不能通过引用传递可变长度的 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));

【讨论】:

  • 如果在函数trimAll中为参数$array加上&前缀,是否可以正常使用
  • 它不会,它会抱怨致命错误:只有变量可以通过第 15 行的引用传递codepad.org/FItzMVjn
  • 也许我应该采用方法的stereofrog
  • @ken:这不是通过引用传递的调用时间。特别允许将引用放入数组中
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    不过,user187291 的解决方法看起来要简单得多。

    【讨论】:

    • 是的,但它需要调用时传递引用,已弃用
    【解决方案5】:

    这也行得通,但可能会让你可能碰巧与之共事的任何人感到沮丧,因为它非常不直观:

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

    【讨论】:

      【解决方案6】:

      这可行,但使用调用时传递引用,在 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";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多