本帖最后由 xuzuning 于 2014-07-04 21:16:48 编辑

解决方案 »

  1.   


    $map = array(
        1 => 7,
        7 => 11,
        8 => 7,
        9 => 8,
        10 => 11,
        11 => 12,
        12 => NULL
    );function getroad($map){
        $key = 1;
        $result = array();
        while($key!=NULL){
            $result[$key] = $map[$key];
            $key = $map[$key];
        }
        return $result;
    }$result = getroad($map);var_export($result);array (
      1 => 7,
      7 => 11,
      11 => 12,
      12 => NULL,
    )
      

  2.   


    有点点问题
    如果key=value就会死循环...
    不过这个可以让通过程序让key!=value
      

  3.   


    这个也会有死循环的问题
    $map = array(
        1 => 11,
        7 => 11,
        8 => 7,
        9 => 8,
        10 => 11,
        11 => 8,
        12 => NULL
    );
      

  4.   

    你之前的结束条件是NULL,而你却写一个死循环的map,明显和约定的条件不同。
    如果死循环,那么结束条件是什么?是否出现循环就直接结束?
      

  5.   

    对的...
    直接出现循环就结束...
    我自己慢慢折腾出来咯..不是很好看
    $a = array(
        7 => 11,
        1 => 11,
        8 => 7,
        9 => 8,
        10 => 11,
        11 => 8,
        12 => NULL,
    );
    $firstID = 1;
    $nextID = 11; //这里程序可以找到是11
    //将第一位提前
    $newReturnTemp[$firstID] = $nextID;
    if (empty($nextID)) {
            return array($a[$firstID]);
    } else {
            //重新组建数组,并让开始为为第一位
            foreach ($a as $key => $value) {
                    $newReturnTemp[$key] = $value;
            }
            unset($key);
            unset($value);
            //获取数组的数目
            $stepCount = count($a);
            //提取所有键值
            $stepArray = array_keys($newReturnTemp);
            //让判断位为第一位
            $temp = $firstID;
            //组件要返回的数组第一位
            $newnew[$firstID] = $nextID;
            //将键值进行循环
            for ($i = 0; $i < $stepCount; $i++) {
                    //默认从第一步开始,
                    if ($temp == $stepArray[$i]) {
                            //键值数组循环后面的值
                            for ($j = $i + 1; $j < $stepCount; $j++) {
                                    //判断是否找到下一级的值,依据$a的内容
                                    if ($newReturnTemp[$stepArray[$i]] == $stepArray[$j]) {
                                            //找到值,写入需要返回的数组
                                            $newnew[$temp] = $stepArray[$j];
                                            //设定下一个判断值
                                            $temp = $stepArray[$j];
                                            //将键值循环的下一位与当前所返回的下一级值对换,并保证下一次判断是从下一级开始
                                            $tt = $stepArray[$j];
                                            $stepArray[$j] = $stepArray[$i + 1];
                                            $stepArray[$i + 1] = $tt;
                                            unset($tt);
                                    }
                            }
                    }
            }
            //将返回排序好的数组,并依据排队内容一次取出相对应的数据,这里是用$a来做演示的...
            foreach ($newnew as $key => $value) {
                    $reReturn[$key] = $a[$key];
                    $last = $value;
            }
            //将默认最后一位没有找到的值或者是不正确的下一级补进数组...(可以不需要这一步)
            if (isset($a[$last])) {
                    $reReturn[$last] = $a[$last];
            }
    }var_dump($reReturn);