将含有父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函数才能使用回调函数。
