按照递归遍历的思路,存在如下问题:
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 ) );

解决方案 »

  1.   

    <?
    $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);
    ?>
      

  2.   

    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; //纪录允许的节点id
      }
      return $s_p; //刚才写错了
    }
      

  3.   

    刚才没仔细调试 又加了点数据
    <?
    $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);?>
      

  4.   

    1、你的数据组织有点问题,应该这样才可以容纳同级节点
    $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
      

  5.   

    xuzuning(唠叨) 好厉害,你把代码优化得看不出曾经是我写过的,注释也比我写的好,值得我学习!
      

  6.   

    谢谢,终于把思路给理清了。
    谢谢wenshuicao(水草),谢谢xuzuning(唠叨)。