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)
编辑:替代方案将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)
通常情况下,在这种情况下,你必须编写一个递归函数 - 如果它不是一个数组,它将处理一个项目; 如果它是一个数组,则调用它自己的项目.
在这里,你可以这样:
$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)