亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

分層數(shù)據(jù)Hierarchical Data探索(1.遞歸)

yzd / 2152人閱讀

摘要:分層數(shù)據(jù)探索例如無限級分類多級菜單省份城市引言什么是分層數(shù)據(jù)類似于樹形結(jié)構(gòu),除了根節(jié)點和葉子節(jié)點外,所有節(jié)點都有一個父節(jié)點和一個或多個子節(jié)點。接下來我會先通過一般方法和遞歸方法來實現(xiàn)無限極分類,然后再通過兩種數(shù)據(jù)模型來談一談分層數(shù)據(jù)的處理。

分層數(shù)據(jù)Hierarchical Data探索(例如:無限級分類、多級菜單、省份城市) 引言

什么是分層數(shù)據(jù)?

類似于樹形結(jié)構(gòu),除了根節(jié)點和葉子節(jié)點外,所有節(jié)點都有一個父節(jié)點和一個或多個子節(jié)點。

大多數(shù)同學都曾在數(shù)據(jù)庫中處理過分層數(shù)據(jù)(hierarchical data),分層數(shù)據(jù)存在于許多基于數(shù)據(jù)庫的應(yīng)用程序中,包括論壇和郵件列表中的分類、商業(yè)組織圖表、內(nèi)容管理系統(tǒng)的分類、產(chǎn)品分類、無限級分類、多級菜單、省份城市等等。但是因為關(guān)系數(shù)據(jù)庫中的表沒有層次關(guān)系,只是簡單的平面化的列表;而分層數(shù)據(jù)具有父-子關(guān)系,顯然關(guān)系數(shù)據(jù)庫中的表不能自然地表現(xiàn)出其分層的特性。

接下來我會先通過一般方法和遞歸(recursion)方法來實現(xiàn)無限極分類,然后再通過兩種數(shù)據(jù)模型來談一談分層數(shù)據(jù)的處理。

分層數(shù)據(jù)Hierarchical Data探索(1.遞歸 recursion)

分層數(shù)據(jù)Hierarchical Data探索(2.鄰接表模型 Adjacency List Model)

分層數(shù)據(jù)Hierarchical Data探索(3.嵌套集合模型 Nested Set Model)

三種方式的變量傳遞

& 引用賦值

function doloop1(&$i = 1)
{
    print_r($i);
    $i++;
    if ($i <= 10) {
        doloop1($i);
    }
}
doloop1();

static 靜態(tài)變量

function doloop2()
{
    static $i = 1;
    print_r($i);
    $i++;
    if ($i <= 10) {
        doloop2();
    }
}

doloop2();

global 全局變量

$i = 1;
function doloop3()
{
    global $i;
    echo $i;
    $i++;
    if ($i <= 10) {
        doloop3();
    }
}
doloop3();
構(gòu)建模擬數(shù)據(jù)
# 模擬數(shù)據(jù)
       $data = [
            ["id" => 1, "title" => "Electronics", "parent_id" => 0],
            ["id" => 2, "title" => "Laptops & PC", "parent_id" => 1],
            ["id" => 3, "title" => "Laptops", "parent_id" => 2],
            ["id" => 4, "title" => "PC", "parent_id" => 2],
            ["id" => 5, "title" => "Cameras & photo", "parent_id" => 1],
            ["id" => 6, "title" => "Camera", "parent_id" => 5],
            ["id" => 7, "title" => "Phones & Accessories", "parent_id" => 1],
            ["id" => 8, "title" => "Smartphones", "parent_id" => 7],
            ["id" => 9, "title" => "Android", "parent_id" => 8],
            ["id" => 10, "title" => "iOS", "parent_id" => 8],
            ["id" => 11, "title" => "Other Smartphones", "parent_id" => 8],
            ["id" => 12, "title" => "Batteries", "parent_id" => 7],
            ["id" => 13, "title" => "Headsets", "parent_id" => 7],
            ["id" => 14, "title" => "Screen Protectors", "parent_id" => 7],
        ];
獲取無限極分類
/**
 * 值引用獲取無限極分類樹
 * 
 * @param array $data
 * @return array
 */
function make_tree($data)
{  
    $refer = array();  
    $tree = array();  
    foreach($data as $k => $v){  
        $refer[$v["id"]] = & $data[$k];  //創(chuàng)建主鍵的數(shù)組引用  
    }  

    foreach($data as $k => $v){  
        $parent_id = $v["parent_id"];   //獲取當前分類的父級id  
        if($parent_id == 0){  
            $tree[] = & $data[$k];   //頂級欄目
        }else{  
            if(isset($refer[$parent_id])){  
                $refer[$parent_id]["children"][] = & $data[$k];  //如果存在父級欄目,則添加進父級欄目的子欄目數(shù)組中  
            }  
        }  
    }  

    return $tree;  
}

/**
 * 遞歸獲取無限極分類樹
 * 
 * @param array $data
 * @param int $parent_id
 * @param int $level
 * @return array
 */
function make_tree2($data = [], $parent_id = 0, $level = 0)
{
    $tree = [];
    if ($data && is_array($data)) {
        foreach ($data as $v) {
            if ($v["parent_id"] == $parent_id) {
                $tree[] = [
                    "id" => $v["id"],
                    "level" => $level,
                    "title" => $v["title"],
                    "parent_id" => $v["parent_id"],
                    "children" => make_tree2($data, $v["id"], $level + 1),
                ];
            }
        }
    }
    return $tree;
}
獲取子節(jié)點以及節(jié)點的層級
/**
 * 引用賦值方式
 * @param array $data
 * @param int $id
 * @param int $level
 * @return array
 */
function getSubTree($data = [], $id = 0, $level = 0)
{
    static $tree = [];

    foreach ($data as $key => $value) {
        if ($value["parent_id"] == $id) {
            $value["laravel"] = $level;
            $tree[] = $value;
            getSubTree($data, $value["id"], $level + 1);
        }
    }
    return $tree;
}

/**
 * 靜態(tài)變量方式
 * @param array $data
 * @param int $id
 * @param int $level
 * @return array
 */
function getSubTree($data = [], $id = 0, $level = 0)
{
    static $tree = [];

    foreach ($data as $key => $value) {
        if ($value["parent_id"] == $id) {
            $value["laravel"] = $level;
            $tree[] = $value;
            getSubTree($data, $value["id"], $level + 1);
        }
    }
    return $tree;
}


/**
 * 全局變量方式
 * @param array $data
 * @param int $id
 * @param int $level
 * @return array
 */

$tree = [];  //先申明變量
function getSubTree($data = [], $id = 0, $level = 0)
{
    global $tree;

    foreach ($data as $key => $value) {
        if ($value["parent_id"] == $id) {
            $value["laravel"] = $level;
            $tree[] = $value;
            getSubTree($data, $value["id"], $level + 1);
        }
    }
    return $tree;
}
通過pid獲取所有上級分類 常用于面包屑導航
/**
 * getParentsByParentId2($categories, 9)
 *
 * @param array $data
 * @param $parent_id
 * @return array
 */
function getParentsByParentId($data = [], $parent_id)
{
    static $categories = [];

    if ($data && is_array($data)) {
        foreach ($data as $item) {
            if ($item["id"] == $parent_id) {
                $categories[] = $item;
                getParentsByParentId($data, $item["parent_id"]);
            }
        }
    }
    return $categories;
}

function getParentsByParentId2($data = [], $parent_id)
{
    $categories = [];

    if ($data && is_array($data)) {
        foreach ($data as $item) {
            if ($item["id"] == $parent_id) {
                $categories[] = $item;
                $categories = array_merge($categories, getParentsByParentId2($data, $item["parent_id"]));
            }
        }
    }
    return $categories;
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/31492.html

相關(guān)文章

  • 分層數(shù)據(jù)Hierarchical Data探索(2.鄰接表模型)

    摘要:分層數(shù)據(jù)探索例如無限級分類多級菜單省份城市引言第一篇分層數(shù)據(jù)探索遞歸已經(jīng)介紹了分層數(shù)據(jù)以及使用遞歸算法實現(xiàn)了無限極分類,但是遞歸即浪費時間,又浪費空間內(nèi)存尤其是在數(shù)據(jù)量大的情況下效率顯著下降。 分層數(shù)據(jù)Hierarchical Data探索(例如:無限級分類、多級菜單、省份城市) 引言 第一篇 分層數(shù)據(jù)Hierarchical Data探索(1.遞歸)已經(jīng)介紹了分層數(shù)據(jù)以及使用遞歸算法...

    Scott 評論0 收藏0
  • 遞歸的藝術(shù) - 深度遞歸網(wǎng)絡(luò)在序列式推薦的應(yīng)用

    摘要:因為在每一時刻對過去的記憶信息和當前的輸入處理策略都是一致的,這在其他領(lǐng)域如自然語言處理,語音識別等問題不大,但并不適用于個性化推薦,一個用戶的聽歌點擊序列,有正負向之分。 在內(nèi)容爆炸性增長的今天,個性化推薦發(fā)揮著越來越重要的作用,如何在海量的數(shù)據(jù)中幫助用戶找到感興趣的物品,成為大數(shù)據(jù)領(lǐng)域極具挑戰(zhàn)性的一項工作;另一方面,深度學習已經(jīng)被證明在圖像處理,計算機視覺,自然語言處理等領(lǐng)域都取得了不俗...

    ZweiZhao 評論0 收藏0
  • DeepMind 提出分層強化學習新模型 FuN,超越 LSTM

    摘要:實驗蒙特祖瑪?shù)膹统鹈商刈娆數(shù)膹统鹗巧献铍y的游戲之一。圖蒙特祖瑪?shù)膹统鸬膶W習曲線在第一個房間中學習的子目標的可視化呈現(xiàn)。結(jié)論如何創(chuàng)建一個能夠?qū)W習將其行為分解為有意義的基元,然后重新利用它們以更有效地獲取新的行為,這是一個長期存在的研究問題。 論文題目:分層強化學習的 FeUdal 網(wǎng)絡(luò)(FeUdal Networks for Hierarchical Reinforcement Learnin...

    dailybird 評論0 收藏0
  • 理解開發(fā)HD錢包涉及的BIP32、BIP44、BIP39

    摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接理解開發(fā)錢包涉及的原文已更新,請讀者前往原文閱讀如果你還在被錢包搞的一頭霧水,來看看這邊文章吧。所以我們要開發(fā)以太坊錢包同樣需要對比特幣的錢包提案有所了解。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:理解開發(fā)HD錢包涉及的BIP32、BIP44、BIP39原文已更新,請讀者前往原文閱讀 如果你還在被HD錢包、BIP32、BIP44、BIP39搞的一頭霧水...

    firim 評論0 收藏0
  • 理解開發(fā)HD錢包涉及的BIP32、BIP44、BIP39

    摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接理解開發(fā)錢包涉及的原文已更新,請讀者前往原文閱讀如果你還在被錢包搞的一頭霧水,來看看這邊文章吧。所以我們要開發(fā)以太坊錢包同樣需要對比特幣的錢包提案有所了解。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:理解開發(fā)HD錢包涉及的BIP32、BIP44、BIP39原文已更新,請讀者前往原文閱讀 如果你還在被HD錢包、BIP32、BIP44、BIP39搞的一頭霧水...

    tianren124 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<