Передать несколько переменных по ссылке в цикл foreach (PHP) - PullRequest
0 голосов
/ 20 января 2010

Сценарий / Изоляция проблемы : Предположим, моя программа использует НЕСКОЛЬКО переменных. В начале программы я хочу манипулировать МНОЖЕСТВОМ переменных в ОДНОМ РАЗРЕШЕНИИ через общую функцию с помощью LITTLE CODE, а затем позже в процессе, используя только несколько характерных переменных в определенных функциях.

Вопрос : Как передать несколько переменных по ссылке в цикл foreach? Или есть лучший / альтернативный метод для прохождения нескольких определенных переменных?

Постов, связанных с темой , но не решил мою проблему:

PHP цикл foreach для нескольких объектов?

Справочная информация (для заинтересованных лиц): У меня есть программа командной строки, которая использует getopts http://hash -bang.net / 2008/12 / missing-php-functions-getopts / чтобы получить различные аргументы, таким образом, я получаю около 20 переменных. Я хочу запустить все переменные, которые содержат filepath (s) (около 10) через «общую» функцию reduHierarchyDots () в ONCE (вместо вызова функции 10 раз).

<?php

/// The "general" function:

function reduceHierarchyDots ($file) {
    while (preg_match('|./\.{2}/|', $file)) { $file = preg_replace('|/([^/]+)/\.{2}/|', '/', $file, 1); }
    $file = preg_replace('|(/(\./)+)|', '/', $file);
    $file = preg_replace('|^(\./)+|', '', $file);
    return $file;
}

function reduceHierarchyDotsRef (&$file) {
    while (preg_match('|./\.{2}/|', $file)) { $file = preg_replace('|/([^/]+)/\.{2}/|', '/', $file, 1); }
    $file = preg_replace('|(/(\./)+)|', '/', $file);
    $file = preg_replace('|^(\./)+|', '', $file);
}

/// The "many" variables:

$x = "something";
$y = 123;
$y = array ("a", "B", 3);
$a = "/Users/jondoe/Desktop/source/0.txt";
$b = "/Users/jondoe/Desktop/source/../1.txt";
$c = "/Users/jondoe/Desktop/source/../../2.txt";
$arrOne = array (
    "v1" => "/some/thing/../1.pdf",
    "v2" => "/some/thing/../../2.pdf",
    "v3" => "/some/thing/../../../3.pdf"
);
$arrTwo = array (
    "./1.doc",
    "/so.me/.thing/ends./././2.doc",
    "./././3.doc"
);

/// At the beginning I want to run multiple determined variables through a "general" function:

/// Debugging: Variables BEFORE the manipulation:
echo("BEFORE:\n"); var_dump($b, $arrOne["v2"], $arrTwo[2]); echo("\n");

/// Method works, but is long! (1 line/statement per function call)
reduceHierarchyDotsRef($b);
reduceHierarchyDotsRef($arrOne["v2"]);
reduceHierarchyDotsRef($arrTwo[2]);

/// Hence, I'd like to pass all variables by reference at once to a foreach loop:
//// These cause: Parse error: syntax error, unexpected '&':
// foreach ( array($b, $arrOne["v2"], $arrTwo[2] ) as &$file) { $file = reduceHierarchyDots($file); }
// foreach (array(&$b, &$arrOne["v2"], &$arrTwo[2] ) as &$file) { $file = reduceHierarchyDotsRef($file); }
//// These have no effect on the intended variables:
// foreach (array(&$b, &$arrOne["v2"], &$arrTwo[2] ) as $file) { $file = reduceHierarchyDots($file); }
// foreach (array(&$b, &$arrOne["v2"], &$arrTwo[2] ) as $file) { $file = reduceHierarchyDotsRef($file); }

/// Debugging: Variables AFTER the manipulation:
echo("AFTER:\n"); var_dump($b, $arrOne["v2"], $arrTwo[2]);

/// After the "general" function ran over various variables, the more specific actions happen: ...

?>

Ответы [ 3 ]

1 голос
/ 20 января 2010

Вы можете попробовать создать массив имен переменных, затем использовать переменные переменных :

$x = '/bees/../ham';
$y = 'some/other/path';

$arr = array('x', 'y');

foreach($arr as $item) {
    reduceHierarchyDotsRef($$item);
}

не уверен, работает ли это с передачей по ссылке, но я не вижу причин, по которым он не работает.

0 голосов
/ 20 января 2010

Передача произвольного числа аргументов функции работает только через func_get_args (), которая не может принимать значения по ссылке. Лучшее решение - сохранить ваши значения в массиве и передать массив по ссылке.

Если вы по-прежнему хотите иметь доступ к значениям в виде отдельных переменных, сохраните их, используя пары ключ / значение, а затем извлеките () массив после его передачи в функцию.

<?php

function test(&$array) {
  /* foreach($array) ... */
}

$ar['x'] = "something";
$ar['y'] = 123;

test($ar);

extract($ar); // pull key/values into the local symbol table

echo $x;
echo $y;
?>

?>

0 голосов
/ 20 января 2010

Передача по ссылке определяется в сигнатуре функции:

function func(&$passByRef);

Вот почему ваш код выдает ошибки.

См .: http://php.net/manual/en/language.references.pass.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...