我有一个类似的多维数组:
(
[0] (
title: 'First Group'
type: 'group'
children: (
[0] (
title: 'Inner Group'
type: 'group'
children: (
[0] (
title: 'Deep image'
type: 'image'
)
[1] (
title: 'Another deep image'
type: 'image'
)
)
)
)
)
[1] (
title: 'Root depth image'
type: 'image'
)
)
我希望能够通过这个数组及其所有子代(这个数组可以无限递归)来打印/回显内容到浏览器。
我遇到的问题是能够为不同类型的项目指定某些标记(甚至对每个项目执行条件)。
EG。仅当每个图像的标题与正则表达式匹配时才打印出来。
我能理解的唯一方法是递归地对数组进行排序必须是一个方法/函数,只要发现了孩子就会调用它自己,但是如果是这种情况,我似乎无法执行条件。
如果存在循环过程(不使用函数),这可能是最合适的选项,因此在每个子项中,我可以执行每个项目所需的任何条件。 我尝试使用而和 foreach 循环,但无济于事。
NB:我已从两个不递归的源数组编译此数组,并且可以使用这些具有相关键的数组,如果这有助于解决方案。
答案 0 :(得分:1)
您只能递归地解决此问题,因为输入大小未定义。
话虽这么说,你可以尝试这样的事情:
$regexp_map = array(
'group' => 'some regexp',
'image' => 'some other regexp'
);
function walk($array) {
$output = '';
foreach($array as $obj) {
if(is_array($obj['children'])) {
$output .= walk($value['children']); //RECURSION
} else {
$regexp = $regexp_map[$obj['type']];
if(preg_match($regexp, $obj['title']))
$output .= $obj['title'];
}
}
return $output;
}
答案 1 :(得分:1)
如果函数变得过于复杂,你需要一个处理程序来完成递归函数的工作。
function walk($array, $handler)
{
foreach($array as $obj) {
if(is_array($obj['children'])) {
walk($obj['children'], $handler); //RECURSION
} else {
$handler($obj);
}
}
}
然后为'image'类型的每个数组元素编写处理函数,正则表达式或其应有的任何作业
function array_handler ($single_array){
#Do some regexp or more complex job here.
print $single_array['url']."<br/>";
}
当你必须打电话时,
walk ($myarray, 'array_handler');
基本上我们定义了一个名为walk的新方法,它就像foreach和while一样,但是代码块将由每个元素的处理程序执行。
完整代码,
<?php
$myarray = array( array (
"title" => 'First Group',
"type" => 'group',
"children" => array (
array ("title" => 'Inner Group',
"type" => "group",
"children" => array (
array (
"title" => "Deep Image",
"type" => 'image',
"url" => "image.jpg"
),
array (
"title" => 'Another Deep Image',
"type" => 'image',
"url" => "image2.jpg"
)
)
)
)
),
array (
"title" => 'Root Deep Image',
"type" => 'image',
"url" => "image.jpg"
)
);
function walk($array, $handler)
{
foreach($array as $obj) {
if(is_array($obj['children'])) {
walk($obj['children'], $handler); //RECURSION
} else {
$handler($obj);
}
}
}
function array_handler ($single_array){
print $single_array['url']."<br/>";
}
walk ($myarray, 'array_handler');
?>