第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何用迭代方式取出層次分明的數(shù)組(即多維數(shù)組)?

如何用迭代方式取出層次分明的數(shù)組(即多維數(shù)組)?

陪伴而非守候 2019-03-21 18:15:03
我想要這種效果,用迭代的方式我現(xiàn)在是這種效果,如何讓取出來的數(shù)組具有層級?目前的代碼,如何修改?或者給個思路也行//迭代調(diào)用子孫樹function node_merge($node,$access,$parent = 0){    $task = array($parent) ; //任務(wù)表    $arr = array(); //返回數(shù)據(jù)    while (!empty($task)) {        $flag = false; //聲明標(biāo)識符        foreach ($node as $k=> $v) {            if($v['pid'] == $parent){                if (isset($node[$parent])) {                    $arr[] = $v;                }                // $arr[] = $v; //將找到的欄目存進(jìn)$arr,等待返回                array_push($task, $v['id']);//將最新的地區(qū)存入任務(wù)棧,只要task還有任務(wù),循環(huán)會繼續(xù).                $parent = $v['id'];//將當(dāng)前id存入$parent                unset($node[$k]); //把找到的單元unset掉                $flag = true; //說明找到了子欄目            }            }        //如果flsg為false,就代表找不到已找不到子欄目了,可以將最后的單元pop掉然后繼續(xù)循環(huán)了.        if ($flag == false) {            array_pop($task); //彈出任務(wù)表                $parent = end($task); //把找到的單元unset掉            }            }        return $arr;}
查看完整描述

1 回答

?
LEATH

TA貢獻(xiàn)1936條經(jīng)驗 獲得超7個贊

應(yīng)該是不用這麼複雜~

用遞歸可以很簡單達(dá)成這樣任務(wù):


遞歸


function parseTree($tree, $root = null) {

    $nested = array();

    foreach($tree as $index => $child) {

        if($child['pid'] == $root) {

            unset($tree[$index]);

            $child['children'] = parseTree($tree, $child['id']);

            $nested[] = $child;

        }

    }

    return empty($nested) ? null : $nested;

}

迭代


function parseTree($rows) {

  // php >= 5.5 提供的方法,可以指定數(shù)組中對象的值當(dāng)作 key 並返回一個新的數(shù)組

  // 詳細(xì)用法可以看官方文檔,這裡簡略解釋下

  // 這邊是以 id 來當(dāng)做 key, 中間參數(shù) null 指返回整個數(shù)組

  $rows = array_column ( $rows, null, 'id' );


  // 遍歷之

  foreach ( $rows as $key => $val ) {

      // 這時的 $key 會是 id


      // 如果 pid 不為 false, 這邊 0 = false

      if ( $val ['pid'] ) {

          // 檢查 pid 指向的值是否存在

          // 這裡就是上面為何要用 array_column 把 id 當(dāng) key 的理由

          // 可以很快速的找到目標(biāo),不用再用各種方法來匹配對象

          if ( isset ( $rows [$val ['pid']] )) {

              // 存在的話就把 自己的 "參考" 往父元素的 children 裡面塞

              // $rows [$key] 代表目前的元素

              // $rows [$val ['pid']]['children'] 代表父元素的 children 數(shù)組

              // 為何要傳參考,因為參考指向的是內(nèi)存位置,這樣當(dāng)你之後對著

              // $rows [$key] 做變動時,所有參考$rows [$key]都會存取到相同的值

              // 而 foreach 是傳值給 $val ,所以我們得手動加個 & 來指向正確的位址 

              $rows [$val ['pid']]['children'][] = &$rows [$key];

          }

      }

  }


  // 這裡是清除掉所有不是祖先元素 ( pid != 0) 

  // 因為該放進(jìn) children 的在上面的 foreach 中已經(jīng)全部處理好了

  // 所以這邊就直接 unset 不是祖先元素的,而 unset ( $rows [$key] ) 只是單純把這個數(shù)組的索引

  // 給清除掉

  // 不會清除掉之前 &$rows [$key] 所引用的參考,這涉及到 php gc 的原理,這邊只能先大概這麼講

  foreach ( $rows as $key => $val ) {

      if ( $val ['pid'] ) unset ( $rows [$key] );

  }


  return $rows;

}


查看完整回答
反對 回復(fù) 2019-04-20
  • 1 回答
  • 0 關(guān)注
  • 582 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號