摘要:分層數(shù)據(jù)探索例如無(wú)限級(jí)分類(lèi)多級(jí)菜單省份城市引言什么是分層數(shù)據(jù)類(lèi)似于樹(shù)形結(jié)構(gòu),除了根節(jié)點(diǎn)和葉子節(jié)點(diǎn)外,所有節(jié)點(diǎn)都有一個(gè)父節(jié)點(diǎn)和一個(gè)或多個(gè)子節(jié)點(diǎn)。接下來(lái)我會(huì)先通過(guò)一般方法和遞歸方法來(lái)實(shí)現(xiàn)無(wú)限極分類(lèi),然后再通過(guò)兩種數(shù)據(jù)模型來(lái)談一談分層數(shù)據(jù)的處理。
分層數(shù)據(jù)Hierarchical Data探索(例如:無(wú)限級(jí)分類(lèi)、多級(jí)菜單、省份城市) 引言
什么是分層數(shù)據(jù)?
類(lèi)似于樹(shù)形結(jié)構(gòu),除了根節(jié)點(diǎn)和葉子節(jié)點(diǎn)外,所有節(jié)點(diǎn)都有一個(gè)父節(jié)點(diǎn)和一個(gè)或多個(gè)子節(jié)點(diǎn)。
大多數(shù)同學(xué)都曾在數(shù)據(jù)庫(kù)中處理過(guò)分層數(shù)據(jù)(hierarchical data),分層數(shù)據(jù)存在于許多基于數(shù)據(jù)庫(kù)的應(yīng)用程序中,包括論壇和郵件列表中的分類(lèi)、商業(yè)組織圖表、內(nèi)容管理系統(tǒng)的分類(lèi)、產(chǎn)品分類(lèi)、無(wú)限級(jí)分類(lèi)、多級(jí)菜單、省份城市等等。但是因?yàn)殛P(guān)系數(shù)據(jù)庫(kù)中的表沒(méi)有層次關(guān)系,只是簡(jiǎn)單的平面化的列表;而分層數(shù)據(jù)具有父-子關(guān)系,顯然關(guān)系數(shù)據(jù)庫(kù)中的表不能自然地表現(xiàn)出其分層的特性。
接下來(lái)我會(huì)先通過(guò)一般方法和遞歸(recursion)方法來(lái)實(shí)現(xiàn)無(wú)限極分類(lèi),然后再通過(guò)兩種數(shù)據(jù)模型來(lái)談一談分層數(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], ];獲取無(wú)限極分類(lèi)
/** * 值引用獲取無(wú)限極分類(lèi)樹(shù) * * @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"]; //獲取當(dāng)前分類(lèi)的父級(jí)id if($parent_id == 0){ $tree[] = & $data[$k]; //頂級(jí)欄目 }else{ if(isset($refer[$parent_id])){ $refer[$parent_id]["children"][] = & $data[$k]; //如果存在父級(jí)欄目,則添加進(jìn)父級(jí)欄目的子欄目數(shù)組中 } } } return $tree; } /** * 遞歸獲取無(wú)限極分類(lèi)樹(shù) * * @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é)點(diǎn)以及節(jié)點(diǎn)的層級(jí)
/** * 引用賦值方式 * @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; }通過(guò)pid獲取所有上級(jí)分類(lèi) 常用于面包屑導(dǎo)航
/** * 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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/31492.html
摘要:分層數(shù)據(jù)探索例如無(wú)限級(jí)分類(lèi)多級(jí)菜單省份城市引言第一篇分層數(shù)據(jù)探索遞歸已經(jīng)介紹了分層數(shù)據(jù)以及使用遞歸算法實(shí)現(xiàn)了無(wú)限極分類(lèi),但是遞歸即浪費(fèi)時(shí)間,又浪費(fèi)空間內(nèi)存尤其是在數(shù)據(jù)量大的情況下效率顯著下降。 分層數(shù)據(jù)Hierarchical Data探索(例如:無(wú)限級(jí)分類(lèi)、多級(jí)菜單、省份城市) 引言 第一篇 分層數(shù)據(jù)Hierarchical Data探索(1.遞歸)已經(jīng)介紹了分層數(shù)據(jù)以及使用遞歸算法...
摘要:因?yàn)樵诿恳粫r(shí)刻對(duì)過(guò)去的記憶信息和當(dāng)前的輸入處理策略都是一致的,這在其他領(lǐng)域如自然語(yǔ)言處理,語(yǔ)音識(shí)別等問(wèn)題不大,但并不適用于個(gè)性化推薦,一個(gè)用戶(hù)的聽(tīng)歌點(diǎn)擊序列,有正負(fù)向之分。 在內(nèi)容爆炸性增長(zhǎng)的今天,個(gè)性化推薦發(fā)揮著越來(lái)越重要的作用,如何在海量的數(shù)據(jù)中幫助用戶(hù)找到感興趣的物品,成為大數(shù)據(jù)領(lǐng)域極具挑戰(zhàn)性的一項(xiàng)工作;另一方面,深度學(xué)習(xí)已經(jīng)被證明在圖像處理,計(jì)算機(jī)視覺(jué),自然語(yǔ)言處理等領(lǐng)域都取得了不俗...
摘要:實(shí)驗(yàn)蒙特祖瑪?shù)膹?fù)仇蒙特祖瑪?shù)膹?fù)仇是上最難的游戲之一。圖蒙特祖瑪?shù)膹?fù)仇的學(xué)習(xí)曲線(xiàn)在第一個(gè)房間中學(xué)習(xí)的子目標(biāo)的可視化呈現(xiàn)。結(jié)論如何創(chuàng)建一個(gè)能夠?qū)W習(xí)將其行為分解為有意義的基元,然后重新利用它們以更有效地獲取新的行為,這是一個(gè)長(zhǎng)期存在的研究問(wèn)題。 論文題目:分層強(qiáng)化學(xué)習(xí)的 FeUdal 網(wǎng)絡(luò)(FeUdal Networks for Hierarchical Reinforcement Learnin...
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接理解開(kāi)發(fā)錢(qián)包涉及的原文已更新,請(qǐng)讀者前往原文閱讀如果你還在被錢(qián)包搞的一頭霧水,來(lái)看看這邊文章吧。所以我們要開(kāi)發(fā)以太坊錢(qián)包同樣需要對(duì)比特幣的錢(qián)包提案有所了解。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:理解開(kāi)發(fā)HD錢(qián)包涉及的BIP32、BIP44、BIP39原文已更新,請(qǐng)讀者前往原文閱讀 如果你還在被HD錢(qián)包、BIP32、BIP44、BIP39搞的一頭霧水...
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接理解開(kāi)發(fā)錢(qián)包涉及的原文已更新,請(qǐng)讀者前往原文閱讀如果你還在被錢(qián)包搞的一頭霧水,來(lái)看看這邊文章吧。所以我們要開(kāi)發(fā)以太坊錢(qián)包同樣需要對(duì)比特幣的錢(qián)包提案有所了解。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:理解開(kāi)發(fā)HD錢(qián)包涉及的BIP32、BIP44、BIP39原文已更新,請(qǐng)讀者前往原文閱讀 如果你還在被HD錢(qián)包、BIP32、BIP44、BIP39搞的一頭霧水...
閱讀 1344·2023-04-26 00:35
閱讀 2714·2023-04-25 18:32
閱讀 3344·2021-11-24 11:14
閱讀 770·2021-11-22 15:24
閱讀 1417·2021-11-18 10:07
閱讀 6466·2021-09-22 10:57
閱讀 2773·2021-09-07 09:58
閱讀 3565·2019-08-30 15:54