$a_list = array(1=>array('ID'=>1, 'PARENT'=>0, 'NAME'=>'祖父'),2=>array('ID'=>2, 'PARENT'=>1, 'NAME'=>'父亲'),3=>array('ID'=>3, 'PARENT'=>1, 'NAME'=>'叔伯'),4=>array('ID'=>4, 'PARENT'=>2, 'NAME'=>'自己'),5=>array('ID'=>5, 'PARENT'=>4, 'NAME'=>'儿子'));
求一算法
如果输入父亲,返回:祖父,父亲,自己,儿子
如果输入叔伯,返回:祖父,叔伯
========================================

解决方案 »

  1.   

    $a_list = array(
    1=>array('ID'=>1, 'PARENT'=>0, 'NAME'=>'祖父'),
    2=>array('ID'=>2, 'PARENT'=>1, 'NAME'=>'父亲'),
    3=>array('ID'=>3, 'PARENT'=>1, 'NAME'=>'叔伯'),
    4=>array('ID'=>4, 'PARENT'=>2, 'NAME'=>'自己'),
    5=>array('ID'=>5, 'PARENT'=>4, 'NAME'=>'儿子')
    );$s = '自己';
    $result = '';
    //查找索引值
    function k($s, $ar) {
       foreach($ar as $k => $v) if ($v['NAME'] == $s) return $k;
    }$searchID = $tmpID = k($s, $a_list);;
    //查找父节点链
    while($a_list[$a_list[$tmpID]['PARENT']]['PARENT'] != 0) {
       $result = $a_list[$a_list[$tmpID]['PARENT']]['NAME'].','.$result;
       $tmpID = $a_list[$tmpID]['PARENT'];
    }
    $result = '祖父,'.$result.$s;
    //echo $result;//递归查找子节点function child($id, $ar) {
       global $result;
       foreach($ar as $k => $v) {
          if ($v['PARENT'] == $id) {
             $result .= ','.$v['NAME'];
             child($v['ID'], $ar);
          }
       }
    }
    child($searchID, $a_list);
    echo $result;
      

  2.   

    $a_list = array(
    1=>array('ID'=>1, 'PARENT'=>0, 'NAME'=>'祖父'),
    2=>array('ID'=>2, 'PARENT'=>1, 'NAME'=>'父亲'),
    3=>array('ID'=>3, 'PARENT'=>1, 'NAME'=>'叔伯'),
    4=>array('ID'=>4, 'PARENT'=>2, 'NAME'=>'自己'),
    5=>array('ID'=>5, 'PARENT'=>4, 'NAME'=>'儿子')
    );
    $ar_ID_NAME = $ar_ID_PARENT = $ar_ID_CHILDREN = array();
    foreach($a_list as $k => $v) {
       $ar_ID_NAME[$v['ID']] = $v['NAME'];
       $ar_ID_PARENT[$v['ID']] = $v['PARENT'];
       $ar_ID_CHILDREN[$v['PARENT']][] = $v['ID'];
    }$needle = $tmp = array_search('自己', $ar_ID_NAME);
    $result = '自己';
    while($ar_ID_PARENT[$tmp] != 0) {
       $result = $ar_ID_NAME[$ar_ID_PARENT[$tmp]].','.$result;
       $tmp = $ar_ID_PARENT[$tmp];
    }
    while(isset($ar_ID_CHILDREN[$needle])) {
       $result .= ','.$ar_ID_NAME[$ar_ID_CHILDREN[$needle][0]];
       $needle = $ar_ID_CHILDREN[$needle][0];
    }
    echo $result;