摘要:分層數據探索例如無限級分類多級菜單省份城市引言什么是分層數據類似于樹形結構,除了根節點和葉子節點外,所有節點都有一個父節點和一個或多個子節點。接下來我會先通過一般方法和遞歸方法來實現無限極分類,然后再通過兩種數據模型來談一談分層數據的處理。
分層數據Hierarchical Data探索(例如:無限級分類、多級菜單、省份城市) 引言
什么是分層數據?
類似于樹形結構,除了根節點和葉子節點外,所有節點都有一個父節點和一個或多個子節點。
大多數同學都曾在數據庫中處理過分層數據(hierarchical data),分層數據存在于許多基于數據庫的應用程序中,包括論壇和郵件列表中的分類、商業組織圖表、內容管理系統的分類、產品分類、無限級分類、多級菜單、省份城市等等。但是因為關系數據庫中的表沒有層次關系,只是簡單的平面化的列表;而分層數據具有父-子關系,顯然關系數據庫中的表不能自然地表現出其分層的特性。
接下來我會先通過一般方法和遞歸(recursion)方法來實現無限極分類,然后再通過兩種數據模型來談一談分層數據的處理。
分層數據Hierarchical Data探索(1.遞歸 recursion)
分層數據Hierarchical Data探索(2.鄰接表模型 Adjacency List Model)
分層數據Hierarchical Data探索(3.嵌套集合模型 Nested Set Model)
三種方式的變量傳遞& 引用賦值
function doloop1(&$i = 1) { print_r($i); $i++; if ($i <= 10) { doloop1($i); } } doloop1();
static 靜態變量
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();構建模擬數據
# 模擬數據 $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]; //創建主鍵的數組引用 } 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]; //如果存在父級欄目,則添加進父級欄目的子欄目數組中 } } } 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; }獲取子節點以及節點的層級
/** * 引用賦值方式 * @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 */ 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; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/31492.html
摘要:分層數據探索例如無限級分類多級菜單省份城市引言第一篇分層數據探索遞歸已經介紹了分層數據以及使用遞歸算法實現了無限極分類,但是遞歸即浪費時間,又浪費空間內存尤其是在數據量大的情況下效率顯著下降。 分層數據Hierarchical Data探索(例如:無限級分類、多級菜單、省份城市) 引言 第一篇 分層數據Hierarchical Data探索(1.遞歸)已經介紹了分層數據以及使用遞歸算法...
摘要:因為在每一時刻對過去的記憶信息和當前的輸入處理策略都是一致的,這在其他領域如自然語言處理,語音識別等問題不大,但并不適用于個性化推薦,一個用戶的聽歌點擊序列,有正負向之分。 在內容爆炸性增長的今天,個性化推薦發揮著越來越重要的作用,如何在海量的數據中幫助用戶找到感興趣的物品,成為大數據領域極具挑戰性的一項工作;另一方面,深度學習已經被證明在圖像處理,計算機視覺,自然語言處理等領域都取得了不俗...
摘要:實驗蒙特祖瑪的復仇蒙特祖瑪的復仇是上最難的游戲之一。圖蒙特祖瑪的復仇的學習曲線在第一個房間中學習的子目標的可視化呈現。結論如何創建一個能夠學習將其行為分解為有意義的基元,然后重新利用它們以更有效地獲取新的行為,這是一個長期存在的研究問題。 論文題目:分層強化學習的 FeUdal 網絡(FeUdal Networks for Hierarchical Reinforcement Learnin...
摘要:本文首發于深入淺出區塊鏈社區原文鏈接理解開發錢包涉及的原文已更新,請讀者前往原文閱讀如果你還在被錢包搞的一頭霧水,來看看這邊文章吧。所以我們要開發以太坊錢包同樣需要對比特幣的錢包提案有所了解。 本文首發于深入淺出區塊鏈社區原文鏈接:理解開發HD錢包涉及的BIP32、BIP44、BIP39原文已更新,請讀者前往原文閱讀 如果你還在被HD錢包、BIP32、BIP44、BIP39搞的一頭霧水...
摘要:本文首發于深入淺出區塊鏈社區原文鏈接理解開發錢包涉及的原文已更新,請讀者前往原文閱讀如果你還在被錢包搞的一頭霧水,來看看這邊文章吧。所以我們要開發以太坊錢包同樣需要對比特幣的錢包提案有所了解。 本文首發于深入淺出區塊鏈社區原文鏈接:理解開發HD錢包涉及的BIP32、BIP44、BIP39原文已更新,請讀者前往原文閱讀 如果你還在被HD錢包、BIP32、BIP44、BIP39搞的一頭霧水...
閱讀 1353·2023-04-26 00:35
閱讀 2723·2023-04-25 18:32
閱讀 3370·2021-11-24 11:14
閱讀 780·2021-11-22 15:24
閱讀 1428·2021-11-18 10:07
閱讀 6535·2021-09-22 10:57
閱讀 2782·2021-09-07 09:58
閱讀 3572·2019-08-30 15:54