$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 这个结果,求大侠解答
"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 这个结果,求大侠解答
$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
{
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;