[英]Get with PHP Array Tree Values Recursively with start and stop limit level
I am making a module for creating navigation menus and I would like to give the possibility to set an initial and final level.我正在制作一个用于创建导航菜单的模块,我想提供设置初始和最终级别的可能性。 I have this array tree with level how can return it setting a start level and stop level?我有这个带有级别的数组树如何返回它设置开始级别和停止级别? this is my function that return empty.这是我返回空的函数。
Original Array:原始数组:
Array
(
[0] => Array
(
[id] => 22
[pid] => 12
[level] => 0
[children] =>
)
[1] => Array
(
[id] => 24
[pid] => 12
[level] => 0
[children] => Array
(
[0] => Array
(
[id] => 27
[pid] => 24
[level] => 1
[children] => Array
(
[0] => Array
(
[id] => 28
[pid] => 27
[level] => 2
[children] =>
)
)
)
)
)
[2] => Array
(
[id] => 25
[pid] => 12
[level] => 0
[children] =>
)
[3] => Array
(
[id] => 26
[pid] => 12
[level] => 0
[children] =>
)
)
My function:我的功能:
function get_tree_limit ($pages, $start_level, $stop_level) {
$result = Array();
foreach( $pages as $page ) {
$children = Array();
if(isset($page['children'])){
$children = get_tree_limit ($page['children'], $start_level, $stop_level);
}
if($page['level'] >= $start_level && $page['level'] <= $stop_level){
$result[] = Array(
'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'],
'children' => $children
);
}
}
return $result;
}
if I try:如果我尝试:
$rpage = get_tree_limit ($pages, 1, 2);
print_r($rpage);
The result is empty:结果为空:
Array()
Where I am wrong?我哪里错了?
Thanks.谢谢。
During simple foreach
loop you need to check the main index children
and in case of it has array datatype you need to turn on recursive action (use is_array($page['children']) ):在简单的foreach
循环中,您需要检查主索引children
项,如果它具有数组数据类型,您需要打开递归操作(使用is_array($page['children']) ):
if(is_array($page['children'])){ } else { }
In case of non-array you can just append this values to the result array if the level
is in range:在非数组的情况下,如果level
在范围内,您可以将此值附加到结果数组:
if( $page['level'] >= $start_level
&& $page['level'] <= $stop_level
&& is_numeric($page['level'])
){
$result[$ind] = Array(
'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'],
'children' => $page['children']
);
}
In case of array datatype you need to do the same, but with recursive action:在数组数据类型的情况下,您需要执行相同的操作,但要进行递归操作:
if( $page['level'] >= $start_level
&& $page['level'] <= $stop_level
&& is_numeric($page['level'])){
$result[$ind] = Array(
'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'],
'children' => @get_tree_limit($page, $start_level, $stop_level)['children']
);
}
if (!isset($result[$ind]) ) {
if (@count(get_tree_limit($page, $start_level, $stop_level)['children'])>0){
$result[$ind] = @get_tree_limit($page, $start_level, $stop_level)['children'];
}
}
@ hides warnings , so the result body of the function looks like next: @隐藏警告,因此函数的结果主体如下所示:
$result = Array();
foreach($pages as $ind => $page ) {
if(is_array($page['children'])){
if($page['level'] >= $start_level
&& $page['level'] <= $stop_level
&& is_numeric($page['level'])){
//print_r($page);
$result[$ind] = Array(
'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'],
'children' => @get_tree_limit($page, $start_level, $stop_level)['children']
);
}
if (!isset($result[$ind]) ) {
if (@count(get_tree_limit($page, $start_level, $stop_level)['children'])>0){
$result[$ind] = @get_tree_limit($page, $start_level, $stop_level)['children'];
}
}
} else {
if($page['level'] >= $start_level && $page['level'] <= $stop_level && is_numeric($page['level'])){
$result[$ind] = Array(
'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'],
'children' => $page['children']
);
}
}
}
return $result;
For example, $res = get_tree_limit($ar, 2, 3);
例如, $res = get_tree_limit($ar, 2, 3);
returns only 2 and 3 levels of the tree:仅返回树的2层和3层:
Array
(
[0] => Array
(
[id] => 28
[pid] => 27
[level] => 2
[children] => Array
(
[id] => 29
[pid] => 28
[level] => 3
[children] => 2
)
)
)
You can choose any level range and you'll get correspond tree branch.您可以选择任何级别范围,您将获得相应的树枝。
Ok this function does its job and I insert if someone is looking for it and to receive some suggestions.好的,这个功能完成了它的工作,如果有人正在寻找它并收到一些建议,我会插入。 I also added the control in the case start and stop are null.我还在开始和停止为空的情况下添加了控件。
function get_tree_limit ($pages, $start_level, $stop_level) {
$result = Array();
foreach($pages as $page) {
$children = Array();
if(isset($page['children'])){
$children = get_tree_limit ($page['children'], $start_level, $stop_level);
}
if($start_level > 0 && $stop_level > 0){
if(!empty($children)){
if($page['level'] >= $start_level && $page['level'] <= $stop_level){
$result[] = Array(
'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'], 'children' => $children
);
} else {
$result = $children;
}
} else {
if($page['level'] >= $start_level && $page['level'] <= $stop_level){
$result[] = Array(
'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level']
);
}
}
} elseif($start_level <= 0 && $stop_level > 0) {
if(!empty($children)){
if($page['level'] <= $stop_level){
$result[] = Array(
'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'], 'children' => $children
);
} else {
$result = $children;
}
} else {
if($page['level'] <= $stop_level){
$result[] = Array(
'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level']
);
}
}
} elseif($start_level > 0 && $stop_level <= 0) {
if(!empty($children)){
if($page['level'] >= $start_level){
$result[] = Array(
'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'], 'children' => $children
);
} else {
$result = $children;
}
} else {
if($page['level'] >= $start_level){
$result[] = Array(
'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level']
);
}
}
} else {
if(!empty($children)){
$result[] = Array(
'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'], 'children' => $children
);
} else {
$result[] = Array(
'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level']
);
}
}
}
return $result;
}
test测试
http://sandbox.onlinephpfunctions.com/code/4e9b1822d294f0af65f81a8ad9ce5f61db7e43f7 http://sandbox.onlinephpfunctions.com/code/4e9b1822d294f0af65f81a8ad9ce5f61db7e43f7
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.