通过引用foreach循环传递多个变量(PHP)

时间:2010-01-19 21:26:58

标签: php variables foreach

场景/问题隔离:假设我的程序使用MULTIPLE变量。在程序开始时,我想通过一个带有LITTLE CODE的常规函数​​来操作许多变量AT ONCE,然后在此过程中稍后只使用特定函数中的少数变量。

问题:如何通过引用foreach循环传递多个变量?或者是否有更好的/替代方法来循环多个确定的变量?

与主题相关的帖子,但未解决我的问题:

PHP foreach loop on multiple objects?

背景(对于那些有关的人):我有一个命令行程序,它使用getopts http://hash-bang.net/2008/12/missing-php-functions-getopts/来获取各种参数,因此我得到了大约20个变量。我想通过ONCE的“常规”函数reduceHierarchyDots()来运行包含filepath(大约10)的所有变量(而不是调用函数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 个答案:

答案 0 :(得分:1)

您可以尝试生成变量名称数组,然后使用variable variables

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

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

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

不确定这是否适用于通过引用传递,但我认为没有理由不使用它。

答案 1 :(得分:0)

按引用传递在函数签名中定义:

function func(&$passByRef);

这就是你的代码抛出错误的原因。

请参阅:http://php.net/manual/en/language.references.pass.php

答案 2 :(得分:0)

将任意数量的参数传递给函数只能通过func_get_args()工作,而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;
?>

&GT;