2013-08-01 4 views
2

Есть ли способ опубликовать или увеличить количество переменных с одним приращением. у меня есть 4 значения, на которых мне нужно увеличивать одно значениеОператор приращения по нескольким значениям

$a = 1; $b = 3; $c = 45; $d = 10; 

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

++$a; ++$b; ++$c; ++$d; 

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

++($a, $b, $c, $d); 

Я пробовал вышеуказанное заявление, но оно не работает.

ответ

4

вы можете использовать array_map вместе с массивом ссылочных переменных

array_map(function(&$var){ $var++; }, array(&$a, &$b, &$c, &$d)); 
+0

Это более подробные исходные приращения. :) – Barmar

+2

Замените 'function ($ var)' на 'function (& $ var)';) – ops

+0

Но почему вы удалили ссылки на переменные в массиве? Он будет работать только со ссылками в обоих местах ... –

1

Нет, это невозможно. Вам просто придется тратить дополнительные заявления, чтобы увеличивать их по одному.

Что-то, что применимо в других ситуациях, заключается в том, что вы можете установить сразу несколько значений. Например,
$a = $b = $c = 10; установит как $ а, $ Ь и $ с до 10.

2

Вы можете написать функцию, которая принимает аргументы ссылка:

function inc_all(&$arg1, &$arg2 = 0, &$arg3 = 0, &$arg4 = 0) { 
    $arg1++; 
    $arg2++; 
    $arg3++; 
    $arg4++; 
} 

inc_all($a, $b, $c, $d); 

Вам нужно закодировать функцию для максимального числа переменных, которые необходимо увеличивать на один раз, потому что это невозможно передать по ссылке на функцию, которая использует func_get_args на проц ss произвольных списков аргументов длины.

+0

Это именно то, о чем я думал. Единственная проблема в том, что требуется 4 аргумента. возможно, используя 'func_get_args', чтобы иметь неизвестное количество аргументов, все переданные по ссылке? – Mike

+0

Я отправил ответ, используя измененную версию' func_get_args', найденную здесь (http://www.php.net/manual/en /function.func-get-args.php#110030) – Indy

+0

@Indy, изменяющий '$ trace [1] ['args']' (на самом деле это должно быть 0, а не 1) использует их только по ссылке внутри функции.Даже если вы выполняете '$ trace [0] ['args'] ++', он изменит его внутри функции, которая не изменит исходную переменную. – Mike

0

Еще один пример, без ссылок:

extract(array_map(function($v){return ++$v;}, compact(array('a','b','c','d')))); 
0

Используя помощь от this code, мне удалось сделать немного более динамичную версию this answer

Это довольно hackjob, но этот пример будет делать трюк для до 9 аргументов.

// Workaround from 
// http://www.php.net/manual/en/function.func-get-args.php#110030 
function func_get_args_byref() { 
    $trace = debug_backtrace(); 
    return $trace[1]['args']; 
} 

// ``&x=0'', required to pass arg as reference 
// You can increase the amount of maximum arguments by adding ``&$x=0'' 
function inc(&$x=0,&$x=0,&$x=0,&$x=0,&$x=0,&$x=0,&$x=0,&$x=0,&$x=0) { 
    $arguments = func_get_args_byref(); 
    foreach ($arguments as &$arg) ++$arg; 
} 

$a = 0; $b = 3; $c = 45; $d = 10; 

inc($a, $b, $c, $d); // a = 1, b = 4, c = 46, d = 11 
inc($b, $d);   // a = 1, b = 5, c = 46, d = 12 
inc($c, $d);   // a = 1, b = 5, c = 47, d = 13 
inc($a, $a, $c);  // a = 3, b = 5, c = 48, d = 13 
+0

Почему вы беспокоитесь обо всех параметрических переменных, так как вы не используете их? – Barmar

+0

[обходной путь] (http://www.php.net/manual/en/function.func-get-args.php#110030) не работает без них. – Indy

+0

Можете ли вы увеличить количество переменных, чем параметры в списке аргументов? Если нет, я думаю, что единственное преимущество над моей версией заключается в том, что вам не нужно вносить N шагов в тело функции. – Barmar

Смежные вопросы