1

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" => "/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
    How about you explain to us what you're trying to accomplish, instead of how you're trying to hack some crazy voodoo to meet your ends? I'm almost sure you're going about this the wrong way. Commented Jan 19, 2010 at 21:30
  • why not just create a simple class and save yourself some headaches :-) Commented Jan 19, 2010 at 21:34
  • @hobodave I have a command line program which uses 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). I thought that I better isolate my general question from the specific project. Hope that my explanation helps your imagination. I sincerely aks again how to accomplish to run multiple variables through a general purpose function at once. Commented Jan 19, 2010 at 21:42

2 Answers 2

2

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.

Sign up to request clarification or add additional context in comments.

2 Comments

Passing variable variables by reference worked fine for "0-dimensional" objects like string variables, but I couldn't figure out the syntax for "multi-dimensional" objects such as indexed or keyed arrays. The PHP man page says: ${$a[1]} means to use $a[1] as a variable. ${$a}[1] means to use $$a as the variable and then the [1] index from that variable. But that didn't help me so far.
I can only suggest that you build a dummy script and try things out if the docs aren't quite clear - I do this all the time. It should work regardless if you want to pass the whole array though.
1

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

2 Comments

I have the foreach loop in 2 "styles" (using / not using by-reference) and the function in 2 "styles" (using / not using by-reference). And tried them in all possible combinations, but failed. Hence I sincerely aks again how to accomplish to run multiple variables through a general purpose function at once.
@porg Store the values in an array, and pass the array by reference.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.