您的位置:

PHP array_walk_recursive函数的用法和示例

一、array_walk_recursive函数概述

array_walk_recursive是PHP中用于对数组或对象中的每个元素应用用户自定义函数的函数,其递归地遍历多维数组或对象,对每个元素执行用户自定义的回调函数。

array_walk_recursive是在原数组上直接操作,只对数组的值进行修改,而不改变键值,它的语法格式如下:

array_walk_recursive (array $array, callable $callback [, mixed $userdata = NULL ] ) : bool

二、array_walk_recursive函数示例

示例一

本示例演示对一个二维数字数组的每个元素执行一次回调函数,该回调函数在每个元素前插入字符串 "Walking index ",代码如下:

    <?php
        $input = array('a', 'b', array('c', 'd'));
        array_walk_recursive($input, function(&$item, $key) {
            $item = 'Walking index '.$key.': '.$item;
        });
        print_r($input);
    ?>

执行结果为:

    Array
    (
        [0] => Walking index 0: a
        [1] => Walking index 1: b
        [2] => Array
            (
                [0] => Walking index 0: c
                [1] => Walking index 1: d
            )
    )

示例二

本示例演示使用回调函数逆向处理数组的值,代码如下:

    <?php
        $arr = ["hello", "world", ["foo", "bar", ["hi", "earth"]]];
        function reverse_value(&$value, $key) {
            $value = strrev($value);
        }
        array_walk_recursive($arr, 'reverse_value');
        print_r($arr);
    ?>

执行结果为:

    Array
    (
        [0] => olleh
        [1] => dlrow
        [2] => Array
            (
                [0] => oof
                [1] => rab
                [2] => Array
                    (
                        [0] => ih
                        [1] => htrae
                    )

            )

    )

示例三

本示例演示传递附加参数给回调函数,代码如下:

    <?php
        $trainers = array(
            array("name" => "Gary", "pokemon" => array("Squirtle", "Bulbasaur", "Charmander")),
            array("name" => "Ash", "pokemon" => array("Pikachu", "Squirtle")),
            array("name" => "Misty", "pokemon" => array("Staryu", "Togepi"))
        );
        function printData(&$item, $key, $separator) {
            if(is_array($item)) {
                $item = implode($separator, $item);
            }
            echo $key . ' : ' . $item . '<br/>';
        }
        array_walk_recursive($trainers, function(&$item, $key) use($separator) {
            printData($item, $key, "/");
        });
    ?>

执行结果为:

    name : Gary<br/>
    0 : Squirtle<br/>
    1 : Bulbasaur<br/>
    2 : Charmander<br/>
    name : Ash<br/>
    0 : Pikachu<br/>
    1 : Squirtle<br/>
    name : Misty<br/>
    0 : Staryu<br/>
    1 : Togepi<br/>

三、array_walk_recursive函数注意事项

1、array_walk_recursive函数仅限于单个变量(scalar)的类型强制转换;如果回调函数试图修改数组结构,例如添加或删除元素,则函数将失败,因为它无法跟踪新索引。

2、 array_walk_recursive函数接受回调函数的引用参数(&$item)。这使得您可以修改函数内部的参数值。

3、传递给回调函数的$key参数是元素的键。如果是二维或更高维,则键将包括每个嵌套维。