$a = array("0" => array("id" => "1","fid" => "0","name" => "a",
                        "children" => array("0" => array("id" => "7","fid" => "1" ,"name" =>"aa","children"=> array("0" => array("id" => "8","fid" => "7" ,"name" =>"a1"),
                                                                                                                    "1" => array("id" => "9","fid" => "7" ,"name" =>"a2"), 
                                                                                                                    "2" => array("id" => "10","fid" => "7" ,"name" =>"a3")),) 
                        ),),
     array("1" => array("id" => "11","fid" => "0","name" => "b")),
     array("2" => array("id" => "12","fid" => "0","name" => "c")),
 );当数组为$a,id =10时候要求输出$b = a-aa-a3 这个结果,求大侠解答   

解决方案 »

  1.   

    这种数据格式易于顶层找下层( 父 -> 子),而不利于下层找顶层,但是可以通过栈记录寻找下层的路径来实现你的目的!<?php
    $a = array(
    "0" => array(
    "id" => "1", 
    "fid" => "0", 
    "name" => "a", 
    "children" => array(
    "0" => array(
    "id" => "7", 
    "fid" => "1", 
    "name" => "aa", 
    "children" => array(
    "0" => array(
    "id" => "8", 
    "fid" => "7", 
    "name" => "a1"
    ), 
    "1" => array(
    "id" => "9", 
    "fid" => "7", 
    "name" => "a2"
    ), 
    "2" => array(
    "id" => "10", 
    "fid" => "7", 
    "name" => "a3"
    )
    )
    )
    )
    ), 
    // 这里给出的数据不对,我修改了一下
    "1" => array(
    "id" => "11", 
    "fid" => "0", 
    "name" => "b"
    ), 
    "2" => array(
    "id" => "12", 
    "fid" => "0", 
    "name" => "c", 
    "children" => array(
    "0" => array(
    "id" => "13", 
    "fid" => "12", 
    "name" => "c1",
    "children" => array(
    "0" => array(
    "id" => "16", 
    "fid" => "13", 
    "name" => "cc1"
    ), 
    )
    ), 
    "1" => array(
    "id" => "14", 
    "fid" => "12", 
    "name" => "c2"
    ), 
    "2" => array(
    "id" => "15", 
    "fid" => "12", 
    "name" => "c3"
    )
    )
    )
    );// 用栈的方式解决
    function getAllName($arr, $id) {

    // 数据栈
    $stack = array(null);

    // 初始化栈
    foreach($arr as &$item) {
    array_push($stack, $item);
    };

    // 结果栈
    $ret_stack = array();
    $find_flag = false;
    while($cur_item = array_pop($stack)) {

    // 如果元素fid = 0, $ret_stack重置
    if($cur_item['fid'] == 0) {
    $ret_stack = array();
    array_push($ret_stack, $cur_item);

    // 循环弹出,直到到栈顶的最后一个是当前元素的父元素
    } else {
    do {
    if($ret_stack[count($ret_stack)-1]['id'] == $cur_item['fid']) {
    array_push($ret_stack, $cur_item);
    break;
    }
    } while(array_pop($ret_stack));
    }

    // 找到匹配的内容
    if($cur_item['id'] == $id) {
    $find_flag = true;
    break;
    }

    // 如果有children,则要重新压栈
    if(isset($cur_item['children'])) {
    foreach($cur_item['children'] as &$item) {
    array_push($stack, $item);
    }
    }

    }

    $ret = '';

    // 找到内容
    if($find_flag) {
    // 可以看返回栈的内容,你可以随意处理
    //var_dump($ret_stack);
    // 一个处理的演示
    $delimiter = '';
    foreach($ret_stack as $item) {
    $ret .= $delimiter . $item['name'];
    $delimiter = '-';
    }
    }

    return $ret;
    }echo getAllName($a, 10),"\n";
    echo getAllName($a, 16),"\n";返回结果a-aa-a3
    c-c1-cc1
      

  2.   

    抛砖引玉,,,,其实递归写这种需求非常方便function get_pos(&$arr, $id = 0, $pos = '')
    {
    foreach($arr AS $k=>$v)
    {
    if($v['id'] == $id)
    {
    $GLOBALS['res'] = substr($pos . '-' . $v['name'], 1);
    return;
    }
    if(isset($v['children']))
    {
    get_pos($v['children'], $id, $pos . '-' . $v['name']);
    }
    }
    }
    $res = NULL;
    get_pos($a, 16);
    echo $res === NULL ? 'not found' : $res;