Web студия "GrandView"
  Главная   Написать Контакты
   
   
О проекте
Руководство php
 

array_walk_recursive

(PHP 5)

array_walk_recursive --  Рекурсивно применить пользовательскую функцию к каждому элементу массива

Описание

bool array_walk_recursive ( array &input, callback funcname [, mixed userdata] )

Применяет пользовательскую функцию funcname к каждому элементу массива input. Эта функция обрабатывает каждый элемент многомерного массива. Обычно у функции funcname два параметра. Значение массива array в качестве первого параметра, и ключ/индекс в качестве второго. Если указан дополнительный параметр userdata, он будет передан в качестве третьего параметра в функцию обратного вызова funcname.

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Замечание: Если требуется, чтобы функция funcname изменила значения в массиве, определите первый параметр funcname как ссылку. Тогда все изменения будут применены к элементам массива.

Пример 1. Пример использования array_walk_recursive()

<?php
$sweet
= array('a' => 'apple', 'b' => 'banana');
$fruits = array('sweet' => $sweet, 'sour' => 'lemon');

function
test_print($item, $key)
{
    echo
"$key holds $item\n";
}

array_walk_recursive($fruits, 'test_print');
?>

Вывод вышеприведённой программы:

a holds apple
b holds banana
sour holds lemon

Обратите внимание, что ключ 'sweet' никогда не отображается. Никакой ключ, соответствующий значению типа array, не будет передан в функцию.

См. также array_walk().



array_walk> <array_values
Last updated: Sat, 27 Jan 2007
 
add a note add a note User Contributed Notes
array_walk_recursive
wileur at gmail dot com
06-Mar-2007 05:59
A simple way to use callback functions that are defined in a class is to simply pass the class instance and function names as values in an array:
<?php
class testClass {
    function
callbackFunction($value, $key) {
        echo
"$key: $value<br />\n";
    }
    function
printArray($foo) {
       
array_walk_recursive($foo, array($this, 'callbackFunction'));
    }
}
?>
adam dott pub att adamswick dott com
09-Nov-2006 06:08
Thanks to all of you in the prior posts.

I don't like the fact that the current version of array_walk_recursive() doesn't track all array keys.  This version will do that, as well as tracking array depth on multi-dimensional arrays.

- - - - - - -

Class Array_walk_recursive3 {

    private $depth = -1;
    private $userdata, $funcname;
    public $status;
    public $input;
   
    public function __construct($input, $funcname, $userdata = "") {
        $this->input = $input;
        $this->funcname = $funcname;
        $this->userdata = $userdata;
        $this->status = $this->array_walk_recursive($this->input);
    }
   
    private function test_print(&$value, &$key)
    {
        echo str_repeat("  ", $this->depth)."$key holds ";
        if (!is_array($value)) {
            echo $value;

            if (trim($value) == "banana") {
                $value = "cherry";
                $key = "c";
            }
        }
        echo "\n";

    }
   
    private function array_walk_recursive(&$input) {
        $funcname = array(&$this, $this->funcname);
       if (!is_callable($funcname)) {

           return false;
       }
   
       if (!is_array($input)) {
           return false;
       }

        $this->depth++;
   
       foreach (array_keys($input) AS $keyIdx => $key) {
            $saved_value = $input[$key];
            $saved_key = $key;
            call_user_func_array($funcname, array(&$input[$saved_key], &$key));
   
            if ($input[$saved_key] !== $saved_value || $saved_key !== $key) {
                $saved_value = $input[$saved_key];

                unset($input[$saved_key]);
                $input[$key] = $saved_value;
            }
           if (is_array($input[$key])) {
                if (!$this->array_walk_recursive($input[$key], $funcname)) return false;
                $this->depth--;
           }
       }   
       return true;
    }

}

$sweet = array('a' => 'apple', 'b' => 'banana');
$fruits = array('sweet' => $sweet, 'sour' => 'lemon');

$fruitObj = new Array_walk_recursive3($fruits, 'test_print');
echo $fruitObj->status;
$newFruitArr = $fruitObj->input;
print_r($fruits);
print_r($newFruitArr);
ik at paulkaspers dot nl
15-Oct-2006 01:46
To egingell at sisna dot com:

There is a small bug in your function, the following line should be changed:
From: if ($value != $saved_value || $saved_key != $key) {
Into: if ($value !== $saved_value || $saved_key !== $key) {

It's a nice function, because I was searching for something to change the keys of a multiple dimension array.
gieterke at gmail dot com
29-Mar-2006 04:59
I think there are a lot of people who want/have to work object oriented.
this is an Object oriented version

the code is written in PHP5
<?php
   
//auto overload classes, so you don't have to put in all the includes
   
function __autoload($class_name) {
        require_once
$class_name . '.php';
    }

    echo
"TESTING: arraywalker<br>";
   
$anObject = new ClassName();

   
//array_walk_recursive($anObject->getFruits(), 'test_print'); => doesn't work
   
array_walk_recursive($anObject->getFruits(), array(&$anObject, 'test_print'));

    echo
"<br><br>";
       
//if you just want to give the array and not hte function name that handles the array
   
$anObject->arrWalker($anObject->getFruits());
?>

<?php
//Class description---------------------------------------------
class ClassName {
   
//Class variables
   
private $sweet = array();
    private
$fruits = array();

   
//Constructor
   
public function __construct(){
       
$this->sweet = array('a' => 'apple', 'b' => 'banana');
       
$this->fruits = array('sweet' => $this->sweet, 'sour' => 'lemon');
    }

   
//public methods
   
public function getFruits(){
        return
$this->fruits;
    }

    public function
test_print($item, $key){
        echo
"$key holds $item\n<br>";
    }

    public function
arrWalker($arr){
       
array_walk_recursive($arr, array(&$this, 'test_print'));

    }
}
?>

the code above gives following input:
TESTING: arraywalker
a holds apple
b holds banana
sour holds lemon

a holds apple
b holds banana
sour holds lemon
egingell at sisna dot com
18-Mar-2006 01:53
Slightly modified version of array_walk_recursive function by "omega13a at sbcglobal dot net"

$function also modifies the keys in addition to the values.

Usefull if you want to trim() the keys and values of an array.

The $key in $funcname would also have to be passed by referrence.

Named 'array_walk_recursive2' since it is not the same as the PHP5 version, you can rename it to 'array_walk_recursive' if you are running PHP4 and have no reason to upgrade.

<?
function funcname(&$value, &$key, $userdata = "") {
    // Do stuff to $value and $key
}

function array_walk_recursive2(&$input, $funcname, $userdata = "") {
    if (!is_callable($funcname)) {
        return false;
    }

    if (!is_array($input)) {
        return false;
    }

    foreach ($input AS $key => $value) {
        if (is_array($input[$key])) {
            array_walk_recursive2($input[$key], $funcname, $userdata);
        } else {
            $saved_value = $value;
            $saved_key = $key;
            if (!empty($userdata)) {
                $funcname($value, $key, $userdata);
            } else {
                $funcname($value, $key);
            }

            if ($value != $saved_value || $saved_key != $key) {
                unset($input[$saved_key]);
                $input[$key] = $value;
            }
        }
    }
    return true;
}
?>
gabrielu at hotmail dot com
21-Feb-2006 01:13
I decided to add to the previous PHP 4 compatible version of array_walk_recursive() so that it would work within a class and as a standalone function.  Both instances are handled by the following function which I modified from omega13a at sbcglobal dot net.

The following example is for usage within a class.  To use as a standalone function take it out of the class and rename it.  (Example: array_walk_recursive_2)

<?php
class A_Class {

function
array_walk_recursive(&$input, $funcname, $userdata = '') {
  if(!
function_exists('array_walk_recursive')) {
    if(!
is_callable($funcname))
      return
false;

    if(!
is_array($input))
      return
false;

    foreach(
$input as $key=>$value) {
      if(
is_array($input[$key])) {
        if(isset(
$this)) {
          eval(
'$this->' . __FUNCTION__ . '($input[$key], $funcname, $userdata);');
        } else {
          if(@
get_class($this))
            eval(
get_class() . '::' . __FUNCTION__ . '($input[$key], $funcname, $userdata);');
          else
            eval(
__FUNCTION__ . '($input[$key], $funcname, $userdata);');
        }
      } else {
       
$saved_value = $value;

        if(
is_array($funcname)) {
         
$f = '';
          for(
$a=0; $a<count($funcname); $a++)
            if(
is_object($funcname[$a])) {
             
$f .= get_class($funcname[$a]);
            } else {
              if(
$a > 0)
               
$f .= '::';
             
$f .= $funcname[$a];
            }
         
$f .= '($value, $key' . (!empty($userdata) ? ', $userdata' : '') . ');';
          eval(
$f);
        } else {
          if(!empty(
$userdata))
           
$funcname($value, $key, $userdata);
          else
           
$funcname($value, $key);
        }

        if(
$value != $saved_value)
         
$input[$key] = $value;
      }
    }
    return
true;
  } else {
   
array_walk_recursive($input, $funcname, $userdata);
  }
}

function
kv_addslashes(&$v, $k) {
 
$v = addslashes($v);
}
}
?>

Usage:
<?php
$arr
= array(
 
'a' => '"Hello World"',
 
'b' => "'Hello World'",
 
'c' => "Hello 'Worl\"d",
 
'd' => array(
   
'A' => 'H"e"l"l"o" "W"o"r"l"d'
   
)
  );

$class = new A_Class();
$class->array_walk_recursive($arr, array(&$class, 'kv_addslashes'));
print_r($arr);
?>
omega13a at sbcglobal dot net
21-Dec-2005 04:21
This is a peice of code I wrote that appears to create this function for PHP 4.

<?php
if (!function_exists('array_walk_recursive'))
{
    function
array_walk_recursive(&$input, $funcname, $userdata = "")
    {
        if (!
is_callable($funcname))
        {
            return
false;
        }
       
        if (!
is_array($input))
        {
            return
false;
        }
       
        foreach (
$input AS $key => $value)
        {
            if (
is_array($input[$key]))
            {
               
array_walk_recursive($input[$key], $funcname, $userdata);
            }
            else
            {
               
$saved_value = $value;
                if (!empty(
$userdata))
                {
                   
$funcname($value, $key, $userdata);
                }
                else
                {
                   
$funcname($value, $key);
                }
               
                if (
$value != $saved_value)
                {
                   
$input[$key] = $value;
                }
            }
        }
        return
true;
    }
}
?>

Please note it is a conditionaly set function and will have to be put before any call to it.

If there is anything wrong with it, please email me.
cory at lavacube dot com
06-Dec-2005 02:09
A simple way to implement array_walk_recursive() in PHP 4 is to use to do the following...

<?php

// first, lets define our function
   
function test_array_walkr( &$item, $key )
    {
       
// do what you want to do here - in this example we will
        // check to see if $item is an array. If it is, we will
        // check to see if the key '.hide' exists. If this exists,
        // we will set the entire array to NULL;
       
if( is_array($item) && array_key_exists('.hide', $item) )
        {
           
$item = NULL;
        }

       
// this is the code that causes the recursive effect
        // we do this after, to allow for any changes to $item
        // to be included in the next recursive call...
       
if( is_array($item) )
        {
           
array_walk($item, __FUNCTION__);
        }
    }

// next, let's define our array:
$test = array(
               
'one'    => array('one->one', 'one->two', 'one->three'),
               
'two'    => array('.hide'=>true, 'two->one', 'two->two', 'two->three'),
               
'three'    => array('three->one', 'three->two', 'three->three')
            );

// lets run the test. ;-)
   
array_walk($test, 'test_array_walkr');

// ... and get the results
   
print_r($test);

?>

This example will yeild:
Array
(
    [one] => Array
        (
            [0] => one->one
            [1] => one->two
            [2] => one->three
        )
    [two] =>
    [three] => Array
        (
            [0] => three->one
            [1] => three->two
            [2] => three->three
        )
)

Hope this helps someone. :-)
aidan at php dot net
21-Feb-2005 11:10
This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

http://pear.php.net/package/PHP_Compat
hannes (at) tismer.com
14-Dec-2004 11:08
I wondered about an array_mergedown function working with PHP4, using an array_walk_recursive-like function which just merges any number of arrays of any dimension to a one dimension array containing every key=>value part of all arrays:

<?php
function array_mergedown() {
    global
$outarray;
   
$outarray = array();
    function
array_walk_recphp4(&$val,$key) {
        global
$outarray;
        if (
is_array($val)) array_walk($val,'array_walk_recphp4');
        else {
           
$outarray[$key] = $val;
        }
    }
   
$params = func_get_args();
    foreach (
$params as $subarr) {
       
array_walk_recphp4($subarr, '');
    }
    return
$outarray;
}
?>

For testing:

<?php
$arr1
[]["foo1"] = "bar1";
$arr2["foo2"] = "bar2";
$arr2[12] = "bar3";
$arr2[10]["foo4"] = "bar4";
$arr2[]["foo4"][0]["foo5"] = "bar5";
$arr3 = "nono";

print_r(array_mergedown($arr1, $arr2, $arr3));
?>

returns:
Array ( [foo1] => bar1 [foo2] => bar2 [12] => bar3 [foo4] => bar4 [foo5] => bar5 )

I hope this helped someone :)

array_walk> <array_values
Last updated: Sat, 27 Jan 2007
 
 
Новости
11 июля 2007
Сайт запущен
© 2007 info@grandviewstudio.com

Deprecated: Function set_magic_quotes_runtime() is deprecated in /home/sites/grandviewstudiocom/www/65f67d67a94ad980786580ae69e11c07/sape.php on line 324

Deprecated: Function set_magic_quotes_runtime() is deprecated in /home/sites/grandviewstudiocom/www/65f67d67a94ad980786580ae69e11c07/sape.php on line 330
Z058440144362 Z348613067571