开发者

Pass multiple variables by reference to a foreach loop (PHP)

开发者 https://www.devze.com 2022-12-17 23:54 出处:网络
Scenario/Problem Isolation: Lets suppose my program uses MULTIPLE variables. At the program beginning I want to manipulate MANY of the variables AT ONCE through a general function with LITTLE CODE, be

Scenario/Problem Isolation: Lets suppose my program uses MULTIPLE variables. At the program beginning I want to manipulate MANY of the variables AT ONCE through a general function with LITTLE CODE, before then later in the process using only distinctive few variables in specific functions.

Question: How do I pass multiple variables by reference to a foreach loop? Or is there a better/alternative method for looping through multiple determined variables?

Post(s) related to topic, but didn't solve my issue:

PHP foreach loop on multiple objects?

Background (for those concerned): I have a command line program which uses getopts http://hash-bang.net/2008/12/missing-php-functions-getopts/ to get various arguments, thus I get about 20 variables. I want to run all variables, which contain filepath(s) (about 10) through the "general" function reduceHierarchyDots() at ONCE (instead of calling the function 10 times).

<?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" => "/som开发者_JAVA百科e/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: ...

?>


You could try generating an array of the variable names, then using variable variables:

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

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

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

not sure if this works with passing by reference, but I see not reason for it not to work.


Pass by reference is defined in the function signature:

function func(&$passByRef);

That's why your code is throwing errors.

See: http://php.net/manual/en/language.references.pass.php

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号