FAQ
In Online Document say's:
Users may not change the array itself from the callback function. e.g.
Add/delete elements, unset elements, etc. If the array that
array_walk() is applied to is changed, the behavior of this function
is undefined, and unpredictable.

So I'm use Use Optional param( [, mixed $userdata ])

here is my code
========================================================
$return=array();
$disable_full=array('a','b','c');
$disable_start=array('_','!','HTTP'/*,'ddd','ddd','ddd','ddd','ddd'*/);
$check_array=array("a"=>1,"_POST"=>'c',"HTTP"=>"f","ddd"=>array('fefe'));
array_walk($check_array,'walk_fun_with_foreach',&$return);

print_r($return);

function walk_fun_with_foreach(&$source,$key,$return){
global $disable_full,$disable_start;
//var_dump($key);
if(is_array($source)){
array_walk($source,'walk_fun_with_foreach',&$return);
}else{

if(in_array(strval($key),$disable_full)){
//exit;
return;
}else{
foreach($disable_start as $key1 => $value){
if(strpos($key,$value)===0){
//echo $key;
return;
}
}
}
//echo $key;
$return[$key]=$source;
}
}
==========================================================
it's print :
Array ( [0] => fefe )

but in version php5.2.x and higher version,display Warning message:
Warning: Call-time pass-by-reference has been deprecated in

If I'm change
array_walk($check_array,'walk_fun_with_foreach',&$return);
to
array_walk($check_array,'walk_fun_with_foreach',$return);

and
declare function like
function walk_fun_with_foreach(&$source,$key,&$return)
no Warning Display
But result is not my needed.
Anyone has solution about is?I'm don't like use foreach for
instead,beacuse of some preformance reason.

Search Discussions

  • Joey Smith at Jan 13, 2010 at 12:53 am
    This might be better served by taking it to php-general, because I don't
    think you need to pin your question so hard to the behaviour of
    array_walk(). Here's a quick example of (if I understood your question
    correctly) how you might solve it using array_udiff_uassoc and 5.3's new
    'closure' syntax (not required for this, but I do so enjoy using them!)

    <?php
    $return=array();
    $disable_full=array('a','b','c');
    $disable_start=array('_','!','HTTP'/*,'ddd','ddd','ddd','ddd','ddd'*/);
    $check_array=array("a"=>1,"_POST"=>'c',"HTTP"=>"f","ddd"=>array('fefe'));

    function buildFilter($keys, $starts_with) {
    return function ($a, $b) use ($keys, $starts_with) {
    if (in_array($a, $keys)) return 0;
    foreach($starts_with as $value) if (strpos($a, $value)===0) return 0;
    return 1;
    };
    }

    $foo = buildFilter($disable_full, $disable_start);

    var_dump(array_udiff_uassoc($check_array, $disable_full, $disable_start, function () { return 0; }, $foo));
  • Clint Priest at Jan 13, 2010 at 3:01 am
    Joey Smith wrote:
    This might be better served by taking it to php-general, because I don't
    think you need to pin your question so hard to the behaviour of
    array_walk(). Here's a quick example of (if I understood your question
    correctly) how you might solve it using array_udiff_uassoc and 5.3's new
    'closure' syntax (not required for this, but I do so enjoy using them!)
    They are such an excellent addition to the language
    <?php
    $return=array();
    $disable_full=array('a','b','c');
    $disable_start=array('_','!','HTTP'/*,'ddd','ddd','ddd','ddd','ddd'*/);
    $check_array=array("a"=>1,"_POST"=>'c',"HTTP"=>"f","ddd"=>array('fefe'));

    function buildFilter($keys, $starts_with) {
    return function ($a, $b) use ($keys, $starts_with) {
    if (in_array($a, $keys)) return 0;
    foreach($starts_with as $value) if (strpos($a, $value)===0) return 0;
    return 1;
    };
    }

    $foo = buildFilter($disable_full, $disable_start);

    var_dump(array_udiff_uassoc($check_array, $disable_full, $disable_start, function () { return 0; }, $foo));

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupphp-internals @
categoriesphp
postedJan 12, '10 at 7:45p
activeJan 13, '10 at 3:01a
posts3
users3
websitephp.net

People

Translate

site design / logo © 2022 Grokbase