按照递归遍历的思路,存在如下问题:
function r( $t ){
foreach( $t as $k => $v ){
if ( $v[ 'status' ] == 1 )
print $v[ 'title' ];
/*
* 疑问,采用遍历,这是不知道子节点的数据情况,假如本级数据status为0,那么就无法判断
*/
if ( $v[ 'child' ] )
r( $v[ 'child' ] );
}
}
r( $t );===================================================
或,除非分两步,先遍历数组,增加一个动态的数组键。
但,这有个效率的问题。
function r2( $t ){
foreach( $t as $k => $v ){
if ( $v[ 'status' ] == 1 )
// 这里如何设置当前数组单元的ok键为1?
$v[ 'ok' ] == 1;
/*
* 疑问,在这个地方需要,这里如何向上遍历,将所有上级节点ok设置为1?
*/
if ( $v[ 'child' ] )
r2( $v[ 'child' ] );
}
}print_r ( r2( $t ) );
function r( $t ){
foreach( $t as $k => $v ){
if ( $v[ 'status' ] == 1 )
print $v[ 'title' ];
/*
* 疑问,采用遍历,这是不知道子节点的数据情况,假如本级数据status为0,那么就无法判断
*/
if ( $v[ 'child' ] )
r( $v[ 'child' ] );
}
}
r( $t );===================================================
或,除非分两步,先遍历数组,增加一个动态的数组键。
但,这有个效率的问题。
function r2( $t ){
foreach( $t as $k => $v ){
if ( $v[ 'status' ] == 1 )
// 这里如何设置当前数组单元的ok键为1?
$v[ 'ok' ] == 1;
/*
* 疑问,在这个地方需要,这里如何向上遍历,将所有上级节点ok设置为1?
*/
if ( $v[ 'child' ] )
r2( $v[ 'child' ] );
}
}print_r ( r2( $t ) );
$t = array(
0 => array(
"id" => "1", //添加id唯一标示
"title" => '1',
"status" => 0,
"child" => array(
0 => array(
"id" => "2",
"title" => '1.1',
"status" => 1,
)
)
)
);
//把所有允许的id写到数组$s_a
function r( $t ){
global $s_a;
$s_p = 0;
foreach( $t as $k => $v ){
$s_p = $v[ 'status' ];
if ( is_array($v[ 'child' ] ) )
$s_c = r( $v[ 'child' ] ); //返回子节点是否有允许
if($s_p == 1 || $s_c == 1 ){
$s_p = 1;
}
if($s_p==1)
$s_a[ $v[ 'id' ] ]=1;
}
return $v_p;
}
$s_a=array();r( $t );//输出
function prt_r( $t ){
global $s_a;
foreach( $t as $k => $v ){
if( $s_a[ $v[ 'id' ] ]==1);
print $v[ 'title' ] ."<br/>";
if ( is_array($v[ 'child' ] ) )
$s_c = prt_r( $v[ 'child' ] ); //返回子节点是否有允许
}
return $v_p;
}prt_r($t);
?>
global $s_a;
$s_p = 0;
foreach( $t as $k => $v ){
$s_p = $v[ 'status' ];
if ( is_array($v[ 'child' ] ) )
$s_c = r( $v[ 'child' ] ); //返回子节点是否有允许
if($s_p == 1 || $s_c == 1 ){ //如果子节点或当前节点被允许
$s_p = 1;
}
if($s_p==1)
$s_a[ $v[ 'id' ] ]=1; //纪录允许的节点id
}
return $s_p; //刚才写错了
}
<?
$t = array(
0 => array(
"id" => "1", //添加id唯一标示
"title" => '1',
"status" => 0,
"child" => array(
0 => array(
"id" => "2",
"title" => '1.1',
"status" => 1,
)
)
),
1 => array(
"id" => "3", //添加id唯一标示
"title" => '2',
"status" => 0,
"child" => array(
0 => array(
"id" => "4",
"title" => '2.1',
"status" => 0,
)
)
),
2 => array(
"id" => "5", //添加id唯一标示
"title" => '3',
"status" => 1,
"child" => array(
0 => array(
"id" => "6",
"title" => '3.1',
"status" => 0,
)
)
));
//把所有允许的id写到数组$s_a
function r( $t ){
global $s_a;
$s_p = 0;
foreach( $t as $k => $v ){
$s_c = 0;
if ( is_array($v[ 'child' ] ) )
$s_c = r( $v[ 'child' ] ); //返回子节点是否有允许
if($v[ 'status' ] == 1 || $s_c == 1 ){
$s_p = 1;
$s_a[ $v[ 'id' ] ]="1";
}
}
return $s_p;
}
$s_a=array();r( $t );//输出
function prt_r( $t ){
global $s_a;
foreach( $t as $k => $v ){
if( $s_a[ $v[ 'id' ] ] == "1" )
print $v[ 'title' ] ."<br/>";
if ( is_array($v[ 'child' ] ) )
$s_c = prt_r( $v[ 'child' ] ); //返回子节点是否有允许
}
}prt_r($t);?>
$t = array(
array(
'title' => '1',
'status' => 0,
'child' => array(
array(
'title' => '1.1',
'status' => 1,
),
array(
'title' => '1.2',
'status' => 0,
),
),
),
array(
'title' => '2',
'status' => 0,
'child' => array(
array(
'title' => '2.1',
'status' => 1,
),
),
),
);2、输出函数可写做
function get($ar) {
foreach($ar as $k=>$v) {
if($v['status']) {
echo "$v[title]<br>";
if($v['child']) get($v['child']);
}
}
}对上面的数据,显然
get($t);
将没有任何输出,因为最高层次的status都为03、你需要用一个函数对各层次的status做一次调整
function set(&$ar) {
$s = 0;
foreach($ar as $k=>$v) {
if($v['child']) {
$s |= set($ar[$k]['child']);
if(! $v['status']) $ar[$k]['status'] = $s;
}else
$s |= $v['status'];
}
return $s;
}于是
set($t);
get($t);
将输出
1
1.1
2
2.1
谢谢wenshuicao(水草),谢谢xuzuning(唠叨)。