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


Groups > comp.lang.php > #7207

array_walk() callback Was: Count how many times a value occurs in an array

Path csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!eternal-september.org!feeder.eternal-september.org!newsfeed101.telia.com!starscream.dk.telia.net!fu-berlin.de!uni-berlin.de!not-for-mail
From "M. Strobel" <sorry_no_mail_here@nowhere.dee>
Newsgroups comp.lang.php
Subject array_walk() callback Was: Count how many times a value occurs in an array
Date Fri, 28 Sep 2012 10:04:39 +0200
Lines 121
Message-ID <acl40oFlkvtU1@mid.uni-berlin.de> (permalink)
References <475e0b6d-5e6e-4a60-9ec8-21f068bc3913@googlegroups.com> <c8b9fe91-9d7b-4918-b910-835c50399743@h4g2000yqo.googlegroups.com> <5064339a$0$6841$e4fe514c@news2.news.xs4all.nl> <acjcjqF9iovU1@mid.uni-berlin.de> <42505440-8980-4772-85d5-303998824b62@googlegroups.com> <acjhinFap9pU1@mid.uni-berlin.de> <k424l7$fq5$1@speranza.aioe.org> <ack04eFe8fvU1@mid.uni-berlin.de> <k42ime$k3j$1@speranza.aioe.org>
Mime-Version 1.0
Content-Type text/plain; charset=UTF-8
Content-Transfer-Encoding 7bit
X-Trace news.uni-berlin.de 7SdkY1cH9mVPCO4DMDvVkQ93/flWJuadXoXoBMyn9LTTYmBbiR4K03tCwPoK+/jYM=
User-Agent Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120825 Thunderbird/15.0
In-Reply-To <k42ime$k3j$1@speranza.aioe.org>
Xref csiph.com comp.lang.php:7207

Show key headers only | View raw


Am 28.09.2012 00:07, schrieb Christoph Becker:
> M. Strobel wrote:
>> Yes, but I had a problem  with callback functions: if you created them with
>> create_function this was a call-time call-by-reference.
> 
> Could you please give an example. For example
> 
> array_walk($array, create_function('&$x', '$x = trim($x);'));
> 
> works fine.

My requirement was not to change the array, but to return data from inside the callback.

In older PHP you could ignore the warning about Call-time pass-by-reference and give
the callback function a third parameter by ref.

Now there is only one way to do it, see the command line test code below.

/Str.

<?php
/**
 * Testen von array_walk mit Closure und use-Parameter by reference
 */

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;

echo "Number of elements using count(): ", count($a), PHP_EOL;

echo (array_key_exists('K', $a)) ? 'array_key_exists() does work in
sub-arrays':'array_key_exists() does NOT work in sub-arrays', PHP_EOL;


echo '------------------------------',  PHP_EOL;
echo "\tStart run\n";
echo '------------------------------',  PHP_EOL;

/**
 * try a call by ref in a closure use list
 *
 * This is the best solution to return values from the callback.
*/
$f0 = function ($v,$k,$l) use(&$var) {
        if ($k==$l)  $var = $v;
};

$var = 'something';
echo "var before array_walk: ($var)\n";
# this does work, var will be defined: unset($var);
$rc = array_walk_recursive($a, $f0, 'M');

echo "rc = $rc, var after array_walk f0 with call by ref in use list: ($var)\n";
echo '------------------------------',  PHP_EOL;

/**
 * testing f0 in a different scope
 */
function func0($arr,$callback) {
    $var = 'Testing in a local scope with f0';
    echo "var before array_walk: ($var)\n";
    $rc = array_walk_recursive($arr, $callback, 'M');
    return ($rc) ? 'Call successful, var is '.$var : 'Call NOT successful, var is
'.$var ;
}

echo func0($a,$f0), PHP_EOL;
echo "Variable in global scope after call: $var\n";
echo "Result: the var by ref in the use list binds to the global scope where it was
defined.\n";

/**
 * trying to put a call by ref into the parameter list
 */

$f1 =  function ($v,$k,$l, &$var)  {
        if ($k==$l)  $var = $v;
};

$var = 'Test Closure f1';
echo "var before array_walk: ($var)\n";
# this does work, var will be defined: unset($var);
$rc = array_walk_recursive($a, $f1, 'L', $var);

echo "rc = $rc, var after array_walk f1 with call by ref in parameter list: ($var)\n";
echo "We can only pass 1 extra parameter into the callback, f1 does not work\n";
echo '------------------------------',  PHP_EOL;

/**
 * the idea is to test if we have call by ref in a closure parameter
 */
$f2 =  function ($v,$k, &$var)  {
        if ($k=='I')  $var = $v;
};

$var = 'Test Closure f2';
echo "var before array_walk: ($var)\n";
$rc = array_walk_recursive($a, $f2, $var);

echo "rc = $rc, var after array_walk f2 with call by ref in parameter list: ($var)\n";
#echo "We can only pass 1 extra parameter into the callback, f1 does not work\n";
echo '------------------------------',  PHP_EOL;

echo <<<EOD
Result for Closure as callback in array_walk:

We can pass variables by ref in the use() parameter list, and only there.
This is the way to return results.

The callback invocation supports one more variable or value, after value and key.

EOD
;

Back to comp.lang.php | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Count how many times a value occurs in an array Ryan <rbilesky@gmail.com> - 2012-09-26 23:25 -0700
  Re: Count how many times a value occurs in an array aroniss@gmail.com - 2012-09-27 00:10 -0700
  Re: Count how many times a value occurs in an array Captain Paralytic <paul_lautman@yahoo.com> - 2012-09-27 03:48 -0700
    Re: Count how many times a value occurs in an array Erwin Moller <erwinmollerusenet@xs4all.nl> - 2012-09-27 13:08 +0200
      Re: Count how many times a value occurs in an array "M. Strobel" <sorry_no_mail_here@nowhere.dee> - 2012-09-27 18:19 +0200
        Re: Count how many times a value occurs in an array Ryan <rbilesky@gmail.com> - 2012-09-27 10:04 -0700
        Re: Count how many times a value occurs in an array Ryan <rbilesky@gmail.com> - 2012-09-27 10:14 -0700
          Re: Count how many times a value occurs in an array "M. Strobel" <sorry_no_mail_here@nowhere.dee> - 2012-09-27 19:43 +0200
            Re: Count how many times a value occurs in an array Christoph Becker <cmbecker69@gmx.de> - 2012-09-27 20:07 +0200
              Re: Count how many times a value occurs in an array "M. Strobel" <sorry_no_mail_here@nowhere.dee> - 2012-09-27 23:52 +0200
                Re: Count how many times a value occurs in an array Christoph Becker <cmbecker69@gmx.de> - 2012-09-28 00:07 +0200
                array_walk() callback Was: Count how many times a value occurs in an array "M. Strobel" <sorry_no_mail_here@nowhere.dee> - 2012-09-28 10:04 +0200
          Re: Count how many times a value occurs in an array Jerry Stuckle <jstucklex@attglobal.net> - 2012-09-27 18:26 -0400
      Re: Count how many times a value occurs in an array Captain Paralytic <paul_lautman@yahoo.com> - 2012-09-28 07:35 -0700
        Re: Count how many times a value occurs in an array Christoph Becker <cmbecker69@gmx.de> - 2012-09-28 17:40 +0200

csiph-web