PHP foreach()与数组中的数组?

Boj*_*les 12 php arrays iteration

我想在数组中的每个元素上调用一个函数.使用a显然很容易foreach(),但是当我开始分解时,数组包含数组.有人可以帮我解决一个函数,该函数将为数组中的一组数组中的每个键 - >值对执行一些代码.理论上,深度可以是无限的,但如果递归无法工作,那么好的限制将是3次迭代(数组中的数组).

一个示例数组将是从$ _POST中获取的数组:

Array
(
    [languages] => Array
    (
        [0] => php
        [1] => mysql
        [2] => inglip
    )

    [rates] => Array
    (
        [incall] => Array
        (
            [1hr] => 10
        )

        [outcall] => Array
        (
            [1hr] => 10
        )

    )
)

只是为了确保,我想要做的是运行一段代码(一个函数),它传递给数组结构中的每个"末端节点",所以在上面的例子中,当...时会调用它.

[0] => php
[1] => mysql
[2] => inglip
[1hr] => 10
[1hr] => 10

......被发现了.

谢谢你的帮助,

詹姆士

Gor*_*don 19

对于迭代器来说,这是一个完美的工作:

$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
foreach($iterator as $key => $value) {
    echo "$key => $value\n";
}
Run Code Online (Sandbox Code Playgroud)

请参阅键盘上的SPL迭代器实时演示简介

编辑:替代方案将array_walk_recursive在下面的Finbarr的答案中显示


Fin*_*arr 10

请参阅array_walk_recursive - 一个PHP库函数,它针对提供的数组递归调用用户定义的函数.

来自PHP文档:

<?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');
?>
Run Code Online (Sandbox Code Playgroud)

输出:

a holds apple
b holds banana
sour holds lemon
Run Code Online (Sandbox Code Playgroud)

请注意Any key that holds an array will not be passed to the function..

编辑:稍微不那么丑陋的例子:

<?php
$sweet = array('a' => 'apple', 'b' => 'banana');
$fruits = array('sweet' => $sweet, 'sour' => 'lemon');
array_walk_recursive($fruits, function ($item, $key) {
    echo "$key holds $item\n";
});
?>
Run Code Online (Sandbox Code Playgroud)


Pas*_*TIN 6

通常情况下,在这种情况下,你必须编写一个递归函数 - 如果它不是一个数组,它将处理一个项目; 如果它是一个数组,则调用它自己的项目.


在这里,你可以这样:

$arr = array(
    'languages' => array(
        'php', 'mysql', 'inglip', 
    ), 
    'rates' => array(
        'incall' => array('1hr' => 10), 
        'outcall' => array('1hr' => 10), 
    ), 
);

function recurse($item) {
    foreach ($item as $key => $value) {
        if (is_array($value)) {
            recurse($value);
        } else {
            echo "$key : $value\n";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


并在您的数组上调用此递归函数:

recurse($arr);
Run Code Online (Sandbox Code Playgroud)

会得到你:

0 : php
1 : mysql
2 : inglip
1hr : 10
1hr : 10
Run Code Online (Sandbox Code Playgroud)