PHP 使用递归方式 将其二维数组整合为层级树 其中层级id 为一个uuid的格式 造成的诡异问题 已解决

news2024/11/24 4:38:20

不啰嗦  直接上源代码

<?php
function findChildren($list, $p_id){
        $r = array();
        foreach ($list as $k => $item) {
            if ($item['fid'] == $p_id) {
                unset($list[$k]);
                $length = count($r);
                $r[$length] = $item;
                if ($t = findChildren($list, $item['id'])) {
                    $r[$length]['children'] = $t;
                }
            }
        }
        return $r;
}

function findChildren2($list,$p_id,&$sike=[]) {
    $r = array();
    foreach($list as $k=>$item) {
         if($item['fid']==$p_id && !in_array($item['id'],$sike)) {
	    $menu = $item;
            array_push($sike,$item['id']);
	    $children = findChildren2($list,$item['id'],$sike);
            if(!empty($children)) {
                 $menu['children'] = $children;
            }	
 	    $r[] = $menu;
         }
     }
     return $r;
}


$node_list  = [
     ["text"=>"首页","id"=>'1',"fid"=>"0"],
     ["text"=>"基础信息管理","id"=>'2',"fid"=>"0"],
     ["text"=>"站点信息","id"=>'3',"fid"=>'2'],
     ["text"=>"线路信息","id"=>'4',"fid"=>'2'],
];

$node_list1  = [
     ["text"=>"首页","id"=>'2bd6db1b-4971-8a89-b2b7-e729ddb78ffa',"fid"=>"0"],
     ["text"=>"基础信息管理","id"=>'376adc62-5414-a36d-eb49-65ae7c7a91b0',"fid"=>"0"],
     ["text"=>"站点信息","id"=>'8ef4a669-68c0-48f7-5078-1d2a487ff901',"fid"=>'376adc62-5414-a36d-eb49-65ae7c7a91b0'],
     ["text"=>"线路信息","id"=>'7b4a1c42-ec66-3fb5-3266-3686d2466bc9',"fid"=>'376adc62-5414-a36d-eb49-65ae7c7a91b0'],
];

$node_list2  = [
     ["text"=>"首页","id"=>'2bd6db1b-4971-8a89-b2b7-e729ddb78ffa',"fid"=>"0"],
     ["text"=>"基础信息管理","id"=>'b655b684-e112-5908-a522-f4f96728edb0',"fid"=>"0"],
     ["text"=>"站点信息","id"=>'8ef4a669-68c0-48f7-5078-1d2a487ff901',"fid"=>'b655b684-e112-5908-a522-f4f96728edb0'],
     ["text"=>"线路信息","id"=>'7b4a1c42-ec66-3fb5-3266-3686d2466bc9',"fid"=>'b655b684-e112-5908-a522-f4f96728edb0'],
];

$menus_list = findChildren($node_list, 0);
$sike = [];
$menus_list2 = findChildren2($node_list, 0,$sike);
echo "----------------------------------------->>结果1<<------------------------------------".PHP_EOL;
var_dump($menus_list);
echo "----------------------------------------->>结果2<<------------------------------------".PHP_EOL;
var_dump($menus_list2);


echo "正常的uuid格式的层级".PHP_EOL;	
$menus_list3 = findChildren($node_list1, 0);
$sike1 = [];
$menus_list4 = findChildren2($node_list1, 0,$sike1);
echo "----------------------------------------->>结果3<<------------------------------------".PHP_EOL;
var_dump($menus_list3);
echo "----------------------------------------->>结果4<<------------------------------------".PHP_EOL;
var_dump($menus_list4);


echo "不正常的uuid格式的层级".PHP_EOL;
$menus_list5 = findChildren($node_list2, 0);
$sike2 = [];
$menus_list6 = findChildren2($node_list2, 0,$sike2);
echo "----------------------------------------->>结果5<<------------------------------------".PHP_EOL;
var_dump($menus_list5);
echo "----------------------------------------->>结果6<<------------------------------------".PHP_EOL;
var_dump($menus_list6);

结果输出:

----------------------------------------->>结果1<<------------------------------------
array(2) {
  [0]=>
  array(3) {
    ["text"]=>
    string(6) "首页"
    ["id"]=>
    string(1) "1"
    ["fid"]=>
    string(1) "0"
  }
  [1]=>
  array(4) {
    ["text"]=>
    string(18) "基础信息管理"
    ["id"]=>
    string(1) "2"
    ["fid"]=>
    string(1) "0"
    ["children"]=>
    array(2) {
      [0]=>
      array(3) {
        ["text"]=>
        string(12) "站点信息"
        ["id"]=>
        string(1) "3"
        ["fid"]=>
        string(1) "2"
      }
      [1]=>
      array(3) {
        ["text"]=>
        string(12) "线路信息"
        ["id"]=>
        string(1) "4"
        ["fid"]=>
        string(1) "2"
      }
    }
  }
}
----------------------------------------->>结果2<<------------------------------------
array(2) {
  [0]=>
  array(3) {
    ["text"]=>
    string(6) "首页"
    ["id"]=>
    string(1) "1"
    ["fid"]=>
    string(1) "0"
  }
  [1]=>
  array(4) {
    ["text"]=>
    string(18) "基础信息管理"
    ["id"]=>
    string(1) "2"
    ["fid"]=>
    string(1) "0"
    ["children"]=>
    array(2) {
      [0]=>
      array(3) {
        ["text"]=>
        string(12) "站点信息"
        ["id"]=>
        string(1) "3"
        ["fid"]=>
        string(1) "2"
      }
      [1]=>
      array(3) {
        ["text"]=>
        string(12) "线路信息"
        ["id"]=>
        string(1) "4"
        ["fid"]=>
        string(1) "2"
      }
    }
  }
}
正常的uuid格式的层级
----------------------------------------->>结果3<<------------------------------------
array(2) {
  [0]=>
  array(3) {
    ["text"]=>
    string(6) "首页"
    ["id"]=>
    string(36) "2bd6db1b-4971-8a89-b2b7-e729ddb78ffa"
    ["fid"]=>
    string(1) "0"
  }
  [1]=>
  array(4) {
    ["text"]=>
    string(18) "基础信息管理"
    ["id"]=>
    string(36) "376adc62-5414-a36d-eb49-65ae7c7a91b0"
    ["fid"]=>
    string(1) "0"
    ["children"]=>
    array(2) {
      [0]=>
      array(3) {
        ["text"]=>
        string(12) "站点信息"
        ["id"]=>
        string(36) "8ef4a669-68c0-48f7-5078-1d2a487ff901"
        ["fid"]=>
        string(36) "376adc62-5414-a36d-eb49-65ae7c7a91b0"
      }
      [1]=>
      array(3) {
        ["text"]=>
        string(12) "线路信息"
        ["id"]=>
        string(36) "7b4a1c42-ec66-3fb5-3266-3686d2466bc9"
        ["fid"]=>
        string(36) "376adc62-5414-a36d-eb49-65ae7c7a91b0"
      }
    }
  }
}
----------------------------------------->>结果4<<------------------------------------
array(2) {
  [0]=>
  array(3) {
    ["text"]=>
    string(6) "首页"
    ["id"]=>
    string(36) "2bd6db1b-4971-8a89-b2b7-e729ddb78ffa"
    ["fid"]=>
    string(1) "0"
  }
  [1]=>
  array(4) {
    ["text"]=>
    string(18) "基础信息管理"
    ["id"]=>
    string(36) "376adc62-5414-a36d-eb49-65ae7c7a91b0"
    ["fid"]=>
    string(1) "0"
    ["children"]=>
    array(2) {
      [0]=>
      array(3) {
        ["text"]=>
        string(12) "站点信息"
        ["id"]=>
        string(36) "8ef4a669-68c0-48f7-5078-1d2a487ff901"
        ["fid"]=>
        string(36) "376adc62-5414-a36d-eb49-65ae7c7a91b0"
      }
      [1]=>
      array(3) {
        ["text"]=>
        string(12) "线路信息"
        ["id"]=>
        string(36) "7b4a1c42-ec66-3fb5-3266-3686d2466bc9"
        ["fid"]=>
        string(36) "376adc62-5414-a36d-eb49-65ae7c7a91b0"
      }
    }
  }
}
不正常的uuid格式的层级
----------------------------------------->>结果5<<------------------------------------
array(4) {
  [0]=>
  array(3) {
    ["text"]=>
    string(6) "首页"
    ["id"]=>
    string(36) "2bd6db1b-4971-8a89-b2b7-e729ddb78ffa"
    ["fid"]=>
    string(1) "0"
  }
  [1]=>
  array(4) {
    ["text"]=>
    string(18) "基础信息管理"
    ["id"]=>
    string(36) "b655b684-e112-5908-a522-f4f96728edb0"
    ["fid"]=>
    string(1) "0"
    ["children"]=>
    array(2) {
      [0]=>
      array(3) {
        ["text"]=>
        string(12) "站点信息"
        ["id"]=>
        string(36) "8ef4a669-68c0-48f7-5078-1d2a487ff901"
        ["fid"]=>
        string(36) "b655b684-e112-5908-a522-f4f96728edb0"
      }
      [1]=>
      array(3) {
        ["text"]=>
        string(12) "线路信息"
        ["id"]=>
        string(36) "7b4a1c42-ec66-3fb5-3266-3686d2466bc9"
        ["fid"]=>
        string(36) "b655b684-e112-5908-a522-f4f96728edb0"
      }
    }
  }
  [2]=>
  array(3) {
    ["text"]=>
    string(12) "站点信息"
    ["id"]=>
    string(36) "8ef4a669-68c0-48f7-5078-1d2a487ff901"
    ["fid"]=>
    string(36) "b655b684-e112-5908-a522-f4f96728edb0"
  }
  [3]=>
  array(3) {
    ["text"]=>
    string(12) "线路信息"
    ["id"]=>
    string(36) "7b4a1c42-ec66-3fb5-3266-3686d2466bc9"
    ["fid"]=>
    string(36) "b655b684-e112-5908-a522-f4f96728edb0"
  }
}
----------------------------------------->>结果6<<------------------------------------
array(2) {
  [0]=>
  array(3) {
    ["text"]=>
    string(6) "首页"
    ["id"]=>
    string(36) "2bd6db1b-4971-8a89-b2b7-e729ddb78ffa"
    ["fid"]=>
    string(1) "0"
  }
  [1]=>
  array(4) {
    ["text"]=>
    string(18) "基础信息管理"
    ["id"]=>
    string(36) "b655b684-e112-5908-a522-f4f96728edb0"
    ["fid"]=>
    string(1) "0"
    ["children"]=>
    array(2) {
      [0]=>
      array(3) {
        ["text"]=>
        string(12) "站点信息"
        ["id"]=>
        string(36) "8ef4a669-68c0-48f7-5078-1d2a487ff901"
        ["fid"]=>
        string(36) "b655b684-e112-5908-a522-f4f96728edb0"
      }
      [1]=>
      array(3) {
        ["text"]=>
        string(12) "线路信息"
        ["id"]=>
        string(36) "7b4a1c42-ec66-3fb5-3266-3686d2466bc9"
        ["fid"]=>
        string(36) "b655b684-e112-5908-a522-f4f96728edb0"
      }
    }
  }
}

结果5 出现了一个诡异的效果  也就是子级也跑到和父级一个层级了  这显然不是我们想要的结果

findChildren2 是我为了避免结果5 这种情况而进行改造了   

下面是chatGPT 给出的说明

最终结果   修改   使用strcmp 

function findChildren($list, $p_id){
        $r = array();
        foreach ($list as $k => $item) {
            //if ($item['fid'] == $p_id) {
            if (strcmp($item['fid'], $p_id) ===0 )  {
                unset($list[$k]);
                $length = count($r);
                $r[$length] = $item;
                if ($t = findChildren($list, $item['id'])) {
                    $r[$length]['children'] = $t;
                }
            }
        }
        return $r;
}

function findChildren2($list,$p_id,&$sike=[]) {
    $r = array();
    foreach($list as $k=>$item) {
         //if($item['fid']==$p_id && !isset($sike[$item['id']])) {
        if (strcmp($item['fid'], $p_id) ===0 )  {
            $menu = $item;
            //$sike[$item['id']] = true;
            $children = findChildren2($list,$item['id'],$sike);
            if(!empty($children)) {
                 $menu['children'] = $children;
            }
            $r[] = $menu;
         }
     }
     return $r;
}

使用该逻辑判断 :if (strcmp($item['fid'], $p_id) === 0) {}

完美解决!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1194924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Godot Shader -变量的声明

变量的声明 uniform 可以将值传递给着色器。这些值对整个着色器来说是全局的&#xff0c;被称为 uniform。当一个着色器后来被分配给一个材质时&#xff0c;uniform 将作为可编辑的参数出现在其中。uniform 不能从着色器内部写入。 可以在材质编辑器的修改这些uniform的值&a…

万宾科技内涝积水监测仪使用效果一览

当一个城市突降暴雨&#xff0c;对城市管理部门来讲首当其中的是防止积水成患。随着城市人口快速增长&#xff0c;基础设施建设也日益受到更多的关注&#xff0c;城市内涝问题频繁增加&#xff0c;会给城市带来严重的经济损失和人员的安全问题。城市生命线工程建设过程中&#…

黑客(网络安全)技术——高效自学1.0

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习…

屏幕提词软件Presentation Prompter mac中文版使用方法

Presentation Prompter for mac是一款屏幕提词器软件&#xff0c;它可以将您的Mac电脑快速变成提词器&#xff0c;支持编写或导入&#xff0c;可以在一个或多个屏幕上平滑地滚动&#xff0c;Presentation Prompter 下载是为适用于现场表演者&#xff0c;新闻广播员&#xff0c;…

Ps:选区的基本操作

在 Photoshop 中&#xff0c;选区是为处理局部图像而自行定义的一个区域。 定义选区后&#xff0c;操作被限制在选区之内。选区周围显示的虚线边框&#xff0c;俗称“蚂蚁线”。 全选 Select All Ps菜单&#xff1a;选择/全部 Select/All 快捷键&#xff1a;Ctrl A 提示&#…

JVM字符串常量池StringTable

目录 一、StringTable为什么要调整 二、String的基本特性 三、String的内存分配 四、字符串拼接操作 五、intern()方法 六、Stringtable的垃圾回收 七、G1中String去重操作 一、StringTable为什么要调整 jdk7之前&#xff0c;hotspot对于方法区的实现是永久代&#xff…

C语言之文件操作(详解版)

不知不觉我们已经学到C语言的文件操作部分了&#xff0c;这部分内容其实很有意思&#xff0c;因为它可以直接把我们代码中的数据写入硬盘&#xff0c;而不是我们关掉这个程序&#xff0c;代码就没有了&#xff0c;让我们开始学习吧&#xff01; 目录 1.为什么使用文件 2.什么…

伪造referer [极客大挑战 2019]Http1

打开题目 没有发现什么&#xff0c;我们查看源代码 在这里我们发现了提示 访问一下页面得到 提示说不能来自于https://Sycsecret.buuoj.cn&#xff0c;我们尝试访问一下这个url 发现访问不了 我们bp抓包一下 伪造个referer头 referer:https://Sycsecret.buuoj.cn 发包过去…

ChatGPT、GPT-4 Turbo接口调用

接口地址 https://chat.xutongbao.top/api/light/chat/createChatCompletion 请求方式 post 请求参数 model可选值&#xff1a; “gpt-3.5-turbo-1106”、 “gpt-3.5-turbo-16k” 、 “gpt-4”、“gpt-4-1106-preview”。 默认值为&#xff1a; “gpt-3.5-turbo-1106” to…

Delphi TCP服务端监听端口获取客户端RFID网络读卡器上传的刷卡数据

本示例使用设备介绍&#xff1a;液显WIFI无线网络HTTP协议RFID云读卡器可编程实时可控开关TTS语-淘宝网 (taobao.com) unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ComCtrls, ScktComp, StdCtrls, ScktCom…

JVM源码剖析之软、弱、虚引用的处理细节

目录 写在前面&#xff1a; 源码剖析&#xff1a; Java层面&#xff1a; JVM层面&#xff1a; 使用危险点&#xff1a; 总结&#xff1a; 版本信息&#xff1a; jdk版本&#xff1a;jdk8u40 垃圾回收器&#xff1a;Serial new/old 写在前面&#xff1a; 不同的垃圾回收…

PROFINET和UDP、MODBUS-RTU通信速度对比实验

这篇博客我们介绍PROFINET 和MODBUS-RTU通信实验时的数据刷新速度,以及这种速度不同对控制系统带来的挑战都有哪些,在介绍这篇对比实验之前大家可以参考下面的文章链接: S7-1200PLC和SMART PLC的PN智能从站通信 S7-200 SMART 和 S7-1200PLC进行PROFINET IO通信-CSDN博客文…

远程电脑未连接显示器时分辨率太小的问题处理

背景&#xff1a;单位电脑显示器坏了&#xff0c;使用笔记本通过向日葵远程连接&#xff0c;发现分辨率只有800*600并且不能修改&#xff0c;网上找了好久找到了处理方法这里记录一下&#xff0c;主要用到的是一个虚拟显示器软件usbmmidd_v2 1)下载usbmmidd_v2 2&#xff09;…

Flink SQL自定义表值函数(Table Function)

使用场景&#xff1a; 表值函数即 UDTF&#xff0c;⽤于进⼀条数据&#xff0c;出多条数据的场景。 开发流程&#xff1a; 实现 org.apache.flink.table.functions.TableFunction 接⼝实现⼀个或者多个⾃定义的 eval 函数&#xff0c;名称必须叫做 eval&#xff0c;eval ⽅法…

什么是进程等待?

什么是进程等待 在了解进程等待之前&#xff0c;我们要回顾一下什么是僵尸进程&#xff1a;是指一个已经终止执行的进程&#xff0c;但其父进程还没有通过 wait() 系统调用来获取该进程的退出状态信息。当一个进程正常退出或者被终止时&#xff0c;其所占用的系统资源会被操作…

基于SSM的智能物业管理网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

rabbitMq虚拟主机概念

虚拟主机是RabbitMQ中的一种逻辑隔离机制&#xff0c;用于将消息队列、交换机以及其他相关资源进行隔离。 在RabbitMQ中&#xff0c;交换机&#xff08;Exchange&#xff09;用于接收生产者发送的消息&#xff0c;并根据特定的路由规则将消息分发到相应的队列中。而虚拟主机则…

使用 pubsub-js 进行消息发布订阅

npm 包地址 github 包地址 pubsub-js 是一个轻量级的 JavaScript 基于主题的消息订阅发布库 &#xff0c;压缩后小于1b。它具有使用简单、性能高效、支持多平台等优点&#xff0c;可以很好地满足各种需求。 功能特点&#xff1a; 无依赖同步解耦ES3 兼容。pubsub-js 能够在…

快速修复因相机断电导致视频文件打不开的问题

3-5 本文主要解决因相机突然断电导致拍摄的视频文件打不开的问题。 在日常工作中&#xff0c;有时候需要使用相机拍摄视频&#xff0c;比如现在有不少短视频拍摄的需求&#xff0c;如果因电池突然断电的原因&#xff0c;导致拍出来的视频播放不了&#xff0c;这时候就容易出大…

el-table 多表格弹窗嵌套数据显示异常错乱问题

1、业务背景 使用vueelement开发报表功能时&#xff0c;需要列表上某列的超链接按钮弹窗展示&#xff0c;在弹窗的el-table列表某列中再次使用超链接按钮点开弹窗&#xff0c;以此类推多表格弹窗嵌套&#xff0c;本文以弹窗两次为例 最终效果如下示例页面 2、具体实现和问题…