Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.php > #4737 > unrolled thread

array_walk_recursive and call by reference - possible?

Started by"M. Strobel" <sorry_no_mail_here@nowhere.dee>
First post2012-02-05 19:07 +0100
Last post2012-02-05 22:31 +0100
Articles 2 — 1 participant

Back to article view | Back to comp.lang.php


Contents

  array_walk_recursive and call by reference - possible? "M. Strobel" <sorry_no_mail_here@nowhere.dee> - 2012-02-05 19:07 +0100
    Re: array_walk_recursive and call by reference - possible? "M. Strobel" <sorry_no_mail_here@nowhere.dee> - 2012-02-05 22:31 +0100

#4737 — array_walk_recursive and call by reference - possible?

From"M. Strobel" <sorry_no_mail_here@nowhere.dee>
Date2012-02-05 19:07 +0100
Subjectarray_walk_recursive and call by reference - possible?
Message-ID<9p7urpFiglU1@mid.uni-berlin.de>
Hi,

I have designed an array with occasional arrays as values, to mimic the structure of
a html select element with optgroup entries.

Now I need some functions like counting all selectable elements, and searching a key.

I thought array_walk_recursive() was appropriate for this task. But now I have a
problem getting values out of my callback. I could use globals here, but nicer seemed
to be: an extra function parameter "by reference".

Now I keep getting PHP Deprecated:  Call-time pass-by-reference has been deprecated
in ...

I know I can suppress these messages, but is there an "official" way to pass
variables by reference with a callback?

I tested all possible combinations, test script attached.

/Str.

<?php
/**
 * Testen von array_walk
 * result: define by ref does not matter, call by ref is needed
 */

error_reporting(-1);

$sub1 = array('I'=>'Igor', 'J'=>'Jan', 'K'=>'Karl', 'L'=>'Liugi', 'M'=>'Michael');
$sub2 = array('A'=>'Alexa', 'B'=>'Brunhilda','C'=>'Carla','D'=>'Dina','E'=>'Elsa');
$a['F'] = 'Frantzi';
$a['G'] = 'Gustavo';
$a['Gentlemen'] = $sub1;
$a['H'] = 'Hillbilly';
$a['Ladies'] = $sub2;

function findindex($v,$k,$var) {
	if ($k=='K')  $var = $v;
}
function findindex1($v,$k, &$var) {
        if ($k=='K') $var = $v;
}

echo '------------------------------',  PHP_EOL;
echo "\tStart run\n";
echo '------------------------------',  PHP_EOL;
#
# test call by ref
#
$var = 'something';
echo "var before array_walk: ($var)\n";
# this does work, var will be defined: unset($var);
$rc = array_walk_recursive($a, 'findindex', &$var);

echo "rc = $rc, var after array_walk with call by ref: ($var)\n";
echo '------------------------------',  PHP_EOL;
#
# test define by ref
#
$var = 'something';
echo "var before array_walk: ($var)\n";
$rc = array_walk_recursive($a, 'findindex1', $var);

echo "rc = $rc, var after array_walk with define by ref, call by val: ($var)\n";
echo '------------------------------',  PHP_EOL;
#
# test define by ref, call by ref
#
$var = 'something';
echo "var before array_walk: ($var)\n";
$rc = array_walk_recursive($a, 'findindex1', &$var);

echo "rc = $rc, var after array_walk with define by ref + call by ref: ($var)\n";
echo '------------------------------',  PHP_EOL;

[toc] | [next] | [standalone]


#4741

From"M. Strobel" <sorry_no_mail_here@nowhere.dee>
Date2012-02-05 22:31 +0100
Message-ID<9p8apjFhc5U1@mid.uni-berlin.de>
In reply to#4737
Am 05.02.2012 19:07, schrieb M. Strobel:
> Hi,
> 
> I have designed an array with occasional arrays as values, to mimic the structure of
> a html select element with optgroup entries.
> 
> Now I need some functions like counting all selectable elements, and searching a key.
> 
> I thought array_walk_recursive() was appropriate for this task. But now I have a
> problem getting values out of my callback. I could use globals here, but nicer seemed
> to be: an extra function parameter "by reference".
> 
> Now I keep getting PHP Deprecated:  Call-time pass-by-reference has been deprecated
> in ...
> 
> I know I can suppress these messages, but is there an "official" way to pass
> variables by reference with a callback?
> 
> I tested all possible combinations, test script attached.
> 
> /Str.

script cut off

Maybe I should have shown the result of the test:

strobel@s114-intel:~/projekte/PHP> php test-array-walks.php
PHP Deprecated:  Call-time pass-by-reference has been deprecated in
/home/strobel/projekte/PHP/test-array-walks.php on line 38

Deprecated: Call-time pass-by-reference has been deprecated in
/home/strobel/projekte/PHP/test-array-walks.php on line 38
PHP Deprecated:  Call-time pass-by-reference has been deprecated in
/home/strobel/projekte/PHP/test-array-walks.php on line 56

Deprecated: Call-time pass-by-reference has been deprecated in
/home/strobel/projekte/PHP/test-array-walks.php on line 56
Number of elements using count(): 5
array_key_exists() does NOT work in sub-arrays
------------------------------
        Start run
------------------------------
var before array_walk: (something)
rc = 1, var after array_walk with call by ref: (Karl)
------------------------------
var before array_walk: (something)
rc = 1, var after array_walk with define by ref, call by val: (something)
------------------------------
var before array_walk: (something)
rc = 1, var after array_walk with define by ref + call by ref: (Karl)
------------------------------

Résumé: every working combination of by-ref/by-val gets a deprecated message.

/Str.

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.php


csiph-web