将含有父ID的列表转成树,id列表成树_PHP教程
将含有父ID的列表转成树,id列表成树
我们知道数据库一般是以一个列表(id,pid)的形式保存树的。如何提取这棵树呢?最简单的方法就是根据pid循环查表。但是毫无疑问,这会产生巨大的数据库查询开销。
那么一般建议的方法是一次性将全部相关数据全查出来,但是这就涉及到一个问题,如何快速的构建一棵树。
我曾经一直以为,这是一个复杂的操作,至少需要一个递归,时间复杂度不会是O(n)。
前段时间,一个工作上的需求,需要解决这个问题。我仔细想了想,发现完全可以通过单层循环解决这个问题,实现如下:
<span> 1</span> <span>function</span> list2Tree(<span>$listItem</span>, <span>$idx</span> = 'id', <span>$pIdx</span> = 'pid', <span>$childKey</span>= 'list'<span>){ </span><span> 2</span> <span>$map</span> = <span>array</span><span>(); </span><span> 3</span> <span>$pMap</span> = <span>array</span><span>(); </span><span> 4</span> <span> 5</span> <span>foreach</span>(<span>$listItem</span> <span>as</span> <span>$item</span><span>){ </span><span> 6</span> <span>$id</span> = <span>$item</span>[<span>$idx</span><span>]; </span><span> 7</span> <span>$pid</span> = <span>$item</span>[<span>$pIdx</span><span>]; </span><span> 8</span> <span>$map</span>[<span>$id</span>] = &<span>$item</span><span>; </span><span> 9</span> <span>unset</span>(<span>$item</span><span>); </span><span>10</span> <span> } </span><span>11</span> <span>12</span> <span>foreach</span>(<span>$map</span> <span>as</span> <span>$id</span> => &<span>$item</span><span>){ </span><span>13</span> <span>$pid</span> = <span>$item</span>[<span>$pIdx</span><span>]; </span><span>14</span> <span>$item</span>[<span>$childKey</span>] = <span>array</span><span>(); </span><span>15</span> <span>16</span> <span>if</span>(! <span>isset</span>(<span>$map</span>[<span>$pid</span><span>])){ </span><span>17</span> <span>$pMap</span>[<span>$id</span>] = &<span>$item</span><span>; </span><span>18</span> <span> } </span><span>19</span> <span>else</span><span>{ </span><span>20</span> <span>$pItem</span>= &<span>$map</span>[<span>$pid</span><span>]; </span><span>21</span> <span>$pItem</span>[<span>$childKey</span>][] = &<span>$item</span><span>; </span><span>22</span> <span> } </span><span>23</span> <span>24</span> <span>unset</span>(<span>$item</span>, <span>$pItem</span><span>); </span><span>25</span> <span> } </span><span>26</span> <span>27</span> <span>return</span> <span>array_shift</span>(<span>$pMap</span><span>); </span><span>28</span> }
测试一下:
<span> 1</span> <span>//</span><span> 路径方便识别父子关系</span> <span> 2</span> <span>$json</span> = <<<<span>JSON </span><span> 3</span> <span>[ </span><span> 4</span> <span> { </span><span> 5</span> "id": 2, <span> 6</span> "pid": 1, <span> 7</span> "path": "/se" <span> 8</span> }, <span> 9</span> <span> { </span><span>10</span> "id": 3, <span>11</span> "pid": 2, <span>12</span> "path": "/se/4901" <span>13</span> }, <span>14</span> <span> { </span><span>15</span> "id": 4, <span>16</span> "pid": 5, <span>17</span> "path": "/se/4901/mask/query" <span>18</span> }, <span>19</span> <span> { </span><span>20</span> "id": 5, <span>21</span> "pid": 3, <span>22</span> "path": "/se/4901/mask" <span>23</span> }, <span>24</span> <span> { </span><span>25</span> "id": 6, <span>26</span> "pid": 2, <span>27</span> "path": "/se/4902" <span>28</span> }, <span>29</span> <span> { </span><span>30</span> "id": 7, <span>31</span> "pid": 6, <span>32</span> "path": "/se/4902/mask" <span>33</span> <span> } </span><span>34</span> <span>] </span><span>35</span> <span>JSON; </span><span>36</span> <span>37</span> <span>$list</span> = json_decode(<span>$json</span>, <span>true</span><span>); </span><span>38</span> <span>39</span> <span>var_dump</span>(list2Tree(<span>$list</span>));
结果:
<span>array</span>(4<span>) { [</span>"id"]=><span> int(</span>2<span>) [</span>"pid"]=><span> int(</span>1<span>) [</span>"path"]=> <span>string</span>(3) "/se"<span> [</span>"list"]=> <span>array</span>(2<span>) { [</span>0]=> <span>array</span>(4<span>) { [</span>"id"]=><span> int(</span>3<span>) [</span>"pid"]=><span> int(</span>2<span>) [</span>"path"]=> <span>string</span>(8) "/se/4901"<span> [</span>"list"]=> <span>array</span>(1<span>) { [</span>0]=> <span>array</span>(4<span>) { [</span>"id"]=><span> int(</span>5<span>) [</span>"pid"]=><span> int(</span>3<span>) [</span>"path"]=> <span>string</span>(13) "/se/4901/mask"<span> [</span>"list"]=> <span>array</span>(0<span>) { } } } } [</span>1]=> <span>array</span>(4<span>) { [</span>"id"]=><span> int(</span>6<span>) [</span>"pid"]=><span> int(</span>2<span>) [</span>"path"]=> <span>string</span>(8) "/se/4902"<span> [</span>"list"]=> <span>array</span>(1<span>) { [</span>0]=> <span>array</span>(4<span>) { [</span>"id"]=><span> int(</span>7<span>) [</span>"pid"]=><span> int(</span>6<span>) [</span>"path"]=> <span>string</span>(13) "/se/4902/mask"<span> [</span>"list"]=> <span>array</span>(0<span>) { } } } } } }</span>
成功把列表转成了树

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Go語言是一種高效、簡潔且易於學習的程式語言,因其在並發程式設計和網路程式設計方面的優勢而備受開發者青睞。在實際開發中,資料庫操作是不可或缺的一部分,本文將介紹如何使用Go語言實作資料庫的增刪改查操作。在Go語言中,我們通常會使用第三方函式庫來操作資料庫,例如常用的sql套件、gorm等。這裡以sql包為例介紹如何實作資料庫的增刪改查操作。假設我們使用的是MySQL資料庫。

Hibernate多態映射可映射繼承類別到資料庫,提供以下映射類型:joined-subclass:為子類別建立單獨表,包含父類別所有欄位。 table-per-class:為子類別建立單獨資料表,僅包含子類別特有列。 union-subclass:類似joined-subclass,但父類別表聯合所有子類別列。

蘋果公司最新發布的iOS18、iPadOS18以及macOSSequoia系統為Photos應用程式增添了一項重要功能,旨在幫助用戶輕鬆恢復因各種原因遺失或損壞的照片和影片。這項新功能在Photos應用的"工具"部分引入了一個名為"已恢復"的相冊,當用戶設備中存在未納入其照片庫的圖片或影片時,該相冊將自動顯示。 "已恢復"相簿的出現為因資料庫損壞、相機應用未正確保存至照片庫或第三方應用管理照片庫時照片和視頻丟失提供了解決方案。使用者只需簡單幾步

HTML無法直接讀取資料庫,但可以透過JavaScript和AJAX實作。其步驟包括建立資料庫連線、發送查詢、處理回應和更新頁面。本文提供了利用JavaScript、AJAX和PHP來從MySQL資料庫讀取資料的實戰範例,展示如何在HTML頁面中動態顯示查詢結果。此範例使用XMLHttpRequest建立資料庫連接,發送查詢並處理回應,從而將資料填入頁面元素中,實現了HTML讀取資料庫的功能。

PHP處理資料庫連線報錯,可以使用下列步驟:使用mysqli_connect_errno()取得錯誤代碼。使用mysqli_connect_error()取得錯誤訊息。透過擷取並記錄這些錯誤訊息,可以輕鬆識別並解決資料庫連接問題,確保應用程式的順暢運作。

如何在PHP中使用MySQLi建立資料庫連線:包含MySQLi擴充(require_once)建立連線函數(functionconnect_to_db)呼叫連線函數($conn=connect_to_db())執行查詢($result=$conn->query())關閉連線( $conn->close())

PHP是一種廣泛應用於網站開發的後端程式語言,它具有強大的資料庫操作功能,常用於與MySQL等資料庫進行互動。然而,由於中文字元編碼的複雜性,在處理資料庫中文亂碼時常常會出現問題。本文將介紹PHP處理資料庫中文亂碼的技巧與實踐,包括常見的亂碼原因、解決方法和具體的程式碼範例。常見的亂碼原因資料庫字元集設定不正確:資料庫建立時需選擇正確的字元集,如utf8或u

在Golang中使用資料庫回呼函數可以實現:在指定資料庫操作完成後執行自訂程式碼。透過單獨的函數新增自訂行為,無需編寫額外程式碼。回調函數可用於插入、更新、刪除和查詢操作。必須使用sql.Exec、sql.QueryRow或sql.Query函數才能使用回呼函數。
