流程算法

艾派德迷你2 2014-07-04 08:59:38
简单说明
我定义咯一个数组,
数组的key表示当前步的ID,下一步的ID对应的value...
我要生成一个这个新的数组
例子:
array(1 => int 7
7 => int 11
8 => int 7
9 => int 8
10 => int 11
11 => int 12
12 => NULL
)
结果就是
array(
1=>7
7=>11
11=>12
12=>NULL
)
当前知道开头位为1.

求算法...
...全文
102 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
傲雪星枫 2014-07-04
  • 打赏
  • 举报
回复
支持自己动手的,呵呵。 先实现,再优化。
艾派德迷你2 2014-07-04
  • 打赏
  • 举报
回复
对的... 直接出现循环就结束... 我自己慢慢折腾出来咯..不是很好看


$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);
傲雪星枫 2014-07-04
  • 打赏
  • 举报
回复
你之前的结束条件是NULL,而你却写一个死循环的map,明显和约定的条件不同。 如果死循环,那么结束条件是什么?是否出现循环就直接结束?
艾派德迷你2 2014-07-04
  • 打赏
  • 举报
回复
引用 2 楼 fdipzone 的回复:

$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, )
这个也会有死循环的问题 $map = array( 1 => 11, 7 => 11, 8 => 7, 9 => 8, 10 => 11, 11 => 8, 12 => NULL );
艾派德迷你2 2014-07-04
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
$a = array(
  1 => 7,
  7 => 11,
  8 => 7,
  9 => 8,
  10 => 11,
  11 => 12,
  12 => NULL,
);
$i = 1;
while(isset($a[$i])) {
  $r[$i] = $a[$i]; 
  $i = $a[$i];
}
$r[$i] = $a[$i]; 
var_export($r);
array ( 1 => 7, 7 => 11, 11 => 12, 12 => NULL, )
有点点问题 如果key=value就会死循环... 不过这个可以让通过程序让key!=value
傲雪星枫 2014-07-04
  • 打赏
  • 举报
回复

$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, )
xuzuning 2014-07-04
  • 打赏
  • 举报
回复
$a = array(
1 => 7,
7 => 11,
8 => 7,
9 => 8,
10 => 11,
11 => 12,
12 => NULL,
);
$i = 1;
while(isset($a[$i])) {
$r[$i] = $a[$i];
$i = $a[$i];
}
$r[$i] = $a[$i];
var_export($r);
array (
1 => 7,
7 => 11,
11 => 12,
12 => NULL,
)

21,882

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧