Обрезка строковых переменных по ссылке в PHP5 - PullRequest
0 голосов
/ 29 октября 2009

Я видел другой пост, предлагающий использовать этот оператор для обрезки строковых переменных, содержащихся в массиве:

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

Но без успеха строковые переменные не обрезаются после возврата функции.

Почему и как это можно сделать ??

Ответы [ 6 ]

4 голосов
/ 29 октября 2009

Вы не можете передавать переменное количество параметров по ссылке. В качестве обходного пути попробуйте что-то вроде

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

еще лучше, переписать фрагмент, чтобы не требовалось использовать кучу переменных, что в любом случае является плохой идеей

2 голосов
/ 29 октября 2009

Это также работает, но, скорее всего, заставит любого, с кем вы можете работать, разочароваться, так как это очень не интуитивно понятно:

// pass variables by string name
extract(array_map('trim', compact('a', 'b', 'c')));
1 голос
/ 29 октября 2009

Я не уверен, что это возможно с помощью func_get_args, хотя комментарий на странице справки по PHP предлагает одно из возможных альтернативных решений: http://uk3.php.net/manual/en/function.func-get-args.php#90095

Однако обходной путь пользователя 187291 выглядит намного проще.

1 голос
/ 29 октября 2009

Не думаю, что вы можете передать список аргументов переменной длины по ссылке.

Вы можете передать массив ссылок.

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 голосов
/ 07 октября 2011

Это работает, но использует передачу по ссылке во время вызова, что не рекомендуется в 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";
0 голосов
/ 29 октября 2009

Вы пытались передать переменные по ссылке.

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