foreach里面的unset

php菜鸡 2017-05-03 09:20:45
无限级分类 迭代法查看子孙树

function subtree($arr,$parent){
$subs = array();
$task = array($parent);
while(!empty($task)){
$flag = false; //$flag初始化为假
foreach($arr as $k=>$v){
if($v['parent'] == $parent){
$subs[] = $v;
$parent = $v['id'];
array_push($task,$v['id']);
unset($arr[$k]); //为什么此处要用unset??????
$flag = true; //找到子栏目
}
}
if($flag == false){
array_pop($task);
$parent = end($task);
}
print_r($task);
}
return $subs;
}
...全文
313 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
php菜鸡 2017-05-11
  • 打赏
  • 举报
回复
引用 6 楼 fdipzone 的回复:
foreach($arr as $k=>$v) 相当于 $arr[$k] = $v; 要删除 $v 就是删除 $arr[$k] 了; 没有$v[$k] 这个。
$arr[$k] => $v 这样吗
傲雪星枫 2017-05-07
  • 打赏
  • 举报
回复
foreach($arr as $k=>$v) 相当于 $arr[$k] = $v; 要删除 $v 就是删除 $arr[$k] 了; 没有$v[$k] 这个。
傲雪星枫 2017-05-06
  • 打赏
  • 举报
回复
如果不unset,就会重复执行了。
php菜鸡 2017-05-06
  • 打赏
  • 举报
回复
引用 1 楼 jiangchuankyo 的回复:
当 foreach 执行过了 $arr[0] 后就销毁 $arr[0],执行了 $arr[1] 后就销毁 $arr[1] 如果不销毁的话 , while 循环执行到下一次时 后面的 foreach($arr as $k=>$v) 有会把$arr从头执行了
还有个问题,为什么要用$arr[$k],而不是$v[$k]
xuzuning 2017-05-04
  • 打赏
  • 举报
回复
举个例子就清楚了
$ar = array(
  array('id' => 1, 'parent'] =>0),
  array('id' => 2, 'parent'] =>1),
  array('id' => 3, 'parent'] =>1),
);
subtree($ar, 1);
id=1 的节点有 id=2 和 id=3 的两个子节点 当找到 id=2 的节点后,如果不删去的话,下一轮查找就又会找到 id=2 的节点 从而出现死循环,显然这个 unset($arr[$k]); 是不得已而为之的,因为这个算法的思路有问题(他采用的是 深度优先算法,应该还有优化的余地) 而 广度优先算法 就要简单多了
function subtree($arr,$parent){
  $subs = array();
  $task = array($parent);
  for($i=0;$i<count($task); $i++){
    $parent = $task[$i];
    foreach($arr as $k=>$v){
      if($v['parent'] == $parent){
        $subs[] = $v;
        if(! in_array($v['id'], $task)) $task[] = $v['id'];
      }
    }
  }
  return $subs;
}
傲雪星枫 2017-05-04
  • 打赏
  • 举报
回复
执行过的就清除,否则会重复执行。

21,886

社区成员

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

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