Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
PHP 实践:构建基于 ID 的父子关系数据结构_创想鸟

PHP 实践:构建基于 ID 的父子关系数据结构

PHP 实践:构建基于 ID 的父子关系数据结构

本文详细阐述了如何使用 php 数组操作,将扁平化的数据结构转换为具有层级关系的父子结构。通过索引、筛选和合并等步骤,实现将子元素(如答案)嵌套到其对应的父元素(如问题)之下,从而优化数据的组织和可读性,适用于处理如问答系统等场景中的关联数据。

在许多应用场景中,我们经常会遇到需要将数据库查询结果或其他扁平化数据转换为具有层级关系的结构。例如,一个问答系统可能将问题和答案存储在同一个表中,并通过 ID 关联。本教程将展示如何利用 PHP 的数组处理函数,将一个包含问题和答案的扁平数组,转换为一个父子嵌套的层级结构。

理解扁平数据与层级需求

假设我们有一个包含 TYPE (类型,如 ‘Question’ 或 ‘Answer’)、PARTY_ID (唯一标识符) 和 PARENT_USER_CONTENT_ID (父级 ID) 的数组。其中,问题的 PARENT_USER_CONTENT_ID 为空,而答案的 PARENT_USER_CONTENT_ID 则指向其对应问题的 PARTY_ID。

原始扁平数据示例:

$arr = [    [ 'TYPE' => 'Answer', 'PARTY_ID' => 115, 'PARENT_USER_CONTENT_ID' => 114 ],    [ 'TYPE' => 'Question', 'PARTY_ID' => 112, 'PARENT_USER_CONTENT_ID' => '' ],    [ 'TYPE' => 'Question', 'PARTY_ID' => 113, 'PARENT_USER_CONTENT_ID' => '' ],    [ 'TYPE' => 'Answer', 'PARTY_ID' => 116, 'PARENT_USER_CONTENT_ID' => 113 ],    [ 'TYPE' => 'Question', 'PARTY_ID' => 114, 'PARENT_USER_CONTENT_ID' => '' ],    [ 'TYPE' => 'Answer', 'PARTY_ID' => 117, 'PARENT_USER_CONTENT_ID' => 112 ]];

期望的层级结构示例:

立即学习“PHP免费学习笔记(深入)”;

Array (  [0] => Array (    [TYPE] => 'Question',    [PARTY_ID] => 112,    [PARENT_USER_CONTENT_ID] => '',    [ANSWER] => Array ( // 注意这里的键名 'ANSWER'      [TYPE] => 'Answer',      [PARTY_ID] => 117,      [PARENT_USER_CONTENT_ID] => 112    )  )  // ... 其他问题及其答案)

我们的目标是将每个答案作为其对应问题的一个子元素,嵌套在问题数组内部。

核心思路:通过 ID 关联构建层级

实现这一转换的核心思路是:

索引所有元素: 创建一个映射表,通过每个元素的 PARTY_ID 快速查找其完整数据。识别父子关系: 找出所有答案及其对应的父问题 ID。合并数据: 遍历识别出的父子关系,将子元素的数据合并到父元素中。

实现步骤与代码示例

下面是实现上述逻辑的 PHP 代码:

 'Answer', 'PARTY_ID' => 115, 'PARENT_USER_CONTENT_ID' => 114 ],    [ 'TYPE' => 'Question', 'PARTY_ID' => 112, 'PARENT_USER_CONTENT_ID' => '' ],    [ 'TYPE' => 'Question', 'PARTY_ID' => 113, 'PARENT_USER_CONTENT_ID' => '' ],    [ 'TYPE' => 'Answer', 'PARTY_ID' => 116, 'PARENT_USER_CONTENT_ID' => 113 ],    [ 'TYPE' => 'Question', 'PARTY_ID' => 114, 'PARENT_USER_CONTENT_ID' => '' ],    [ 'TYPE' => 'Answer', 'PARTY_ID' => 117, 'PARENT_USER_CONTENT_ID' => 112 ]];// 1. 创建一个以 PARTY_ID 为键的索引数组,方便快速查找// array_column($arr, 'PARTY_ID') 提取所有 PARTY_ID 作为新数组的键// $arr 作为新数组的值$indexed = array_combine(array_column($arr, 'PARTY_ID'), $arr);// 2. 识别父子关系:构建一个映射,键是父ID,值是子ID// array_column($arr, 'PARENT_USER_CONTENT_ID', 'PARTY_ID') 提取所有 PARENT_USER_CONTENT_ID,并以 PARTY_ID 为键// array_filter 过滤掉 PARENT_USER_CONTENT_ID 为空(即问题本身)的项// array_flip 交换键和值,使得父ID成为键,子ID成为值$answers = array_flip(array_filter(array_column($arr, 'PARENT_USER_CONTENT_ID', 'PARTY_ID')));$result = []; // 存储最终的层级结构// 3. 遍历父子关系,将答案合并到对应的问题中foreach ($answers as $parentPartyId => $childPartyId) {    // 从 $indexed 中获取父元素(问题)和子元素(答案)的完整数据    $parent = $indexed[$parentPartyId];    $child = $indexed[$childPartyId];    // 将子元素作为父元素的一个子数组合并,键名为 'ANSWER'    $result[] = array_merge($parent, [ 'ANSWER' => $child ]);}print_r($result);?>

代码解析

$indexed = array_combine(array_column($arr, ‘PARTY_ID’), $arr);

array_column($arr, ‘PARTY_ID’):从原始 $arr 数组中提取所有元素的 PARTY_ID 字段,生成一个新数组 [115, 112, 113, 116, 114, 117]。array_combine(keys, values):将第一个数组的元素作为键,第二个数组的元素作为值,组合成一个新的关联数组。结果 $indexed 是一个以 PARTY_ID 为键,原始数组项为值的关联数组,便于通过 ID 快速查找任何元素。

$answers = array_flip(array_filter(array_column($arr, ‘PARENT_USER_CONTENT_ID’, ‘PARTY_ID’)));

array_column($arr, ‘PARENT_USER_CONTENT_ID’, ‘PARTY_ID’):提取 PARENT_USER_CONTENT_ID 字段的值,并以 PARTY_ID 字段的值作为新数组的键。例如,[115 => 114, 112 => ”, 113 => ”, 116 => 113, 114 => ”, 117 => 112]。array_filter(…):过滤掉值为 ” (空字符串) 的项。这些空值通常表示没有父 ID 的顶级元素(如问题)。过滤后得到 [115 => 114, 116 => 113, 117 => 112],其中键是子元素的 PARTY_ID,值是其父元素的 PARENT_USER_CONTENT_ID。array_flip(…):交换数组的键和值。结果 $answers 变为 [114 => 115, 113 => 116, 112 => 117]。现在,键是父元素的 PARTY_ID,值是对应的子元素的 PARTY_ID。这个结构清晰地表达了“哪个父 ID 对应哪个子 ID”。

foreach ($answers as $parentPartyId => $childPartyId) { … }

遍历 $answers 数组,每次循环都会得到一个父 ID ($parentPartyId) 和一个子 ID ($childPartyId)。$parent = $indexed[$parentPartyId]; 和 $child = $indexed[$childPartyId];:利用之前创建的 $indexed 数组,通过 ID 快速获取父元素和子元素的完整数据。$result[] = array_merge($parent, [ ‘ANSWER’ => $child ]);:[ ‘ANSWER’ => $child ] 创建一个新数组,其键为 ‘ANSWER’,值为子元素的完整数据。这个键名可以根据实际需求自定义。array_merge() 将父元素 $parent 的数据与这个新创建的子元素数组合并。如果父元素和子元素有同名键,array_merge 会以后者的值为准,但在这里,’ANSWER’ 是一个新键,所以它会被添加到父元素的末尾。最终合并后的结果被添加到 $result 数组中。

注意事项

一对一关系假设: 本教程提供的解决方案假设每个父元素(问题)只有一个对应的子元素(答案)。如果一个问题可以有多个答案,则需要调整 array_merge 部分的逻辑,例如将子元素存储为一个数组:$result[] = array_merge($parent, [ ‘ANSWERS’ => [$child] ]); 并在循环中处理追加。键名选择: 在 array_merge 中使用的键名 ‘ANSWER’ 是自定义的。你可以根据实际数据类型和语义需求选择更合适的键名,例如 ‘children’、’replies’ 等。性能考量: 对于处理非常庞大的数据集,虽然 PHP 的数组函数通常经过优化,但多次数组遍历和函数调用仍可能带来性能开销。对于极端情况,可能需要考虑更复杂的算法或数据库层面的优化。数据完整性: 确保 PARTY_ID 和 PARENT_USER_CONTENT_ID 的值类型一致且数据准确。错误的 ID 值会导致关联失败或意外结果。多层级结构: 本方案适用于两层(父-子)的层级结构。如果需要构建更深层次的树形结构(例如,问题 -> 答案 -> 评论),则通常需要使用递归函数来处理。

总结

通过上述 PHP 数组操作技巧,我们可以高效地将扁平化的关联数据转换为清晰的层级结构。这种方法利用了 array_combine、array_column、array_filter 和 array_flip 等强大函数,避免了复杂的循环和条件判断,使得代码简洁且易于理解。掌握这些技巧对于处理各种数据组织和转换任务都非常有益。

以上就是PHP 实践:构建基于 ID 的父子关系数据结构的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1329239.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
php函数如何安全过滤输入 php函数防止SQL注入的技巧
上一篇 2025年12月12日 15:27:54
PHP 关联数组默认值处理:避免“未定义索引”通知
下一篇 2025年12月12日 15:28:01

相关推荐

  • Bilibili官方网址入口 Bilibili网页登录页面

    Bilibili官方网址为https://www.bilibili.com/,该平台涵盖动画、游戏、音乐等多元分区,支持用户上传原创或搬运内容,提供长短视频混合浏览及图文专栏功能;其弹幕系统和三连互动机制增强观看参与感,评论区支持楼中楼讨论,直播结合打赏与粉丝牌提升互动;注册后可绑定手机并开启双重验…

    2026年9月22日
    000
  • Loadrunner从入门到精通教程(一)

    Loadrunner从入门到精通教程(一)Loadrunner从入门到精通教程(一)Loadrunner从入门到精通教程(一)Loadrunner从入门到精通教程(一)

    大家好,又见面了,我是你们的朋友全栈君。 第一章:性能测试基础 1-1.大话性能测试 性能测试的定义 性能测试是利用自动化测试工具,依据特定的性能指标对产品进行测试,以解决性能与用户体验之间的平衡问题,为用户提供最佳的体验。 性能测试的时代背景和作用 在大数据时代,性能测试的应用广泛,包括网站(BA…

    2026年9月22日 • 用户投稿
    300
  • 设置php连接mssql的编码格式_通过php连接mssql支持UTF-8编码

    正确配置PHP连接MSSQL并支持UTF-8需:1. 使用sqlsrv扩展并启用extension=php_sqlsrv_80.dll;2. 连接时设置”CharacterSet”=>”UTF-8″;3. 数据库字段使用nvarchar等Unic…

    2026年9月22日
    100
  • 使用php连接mssql实现日志记录_通过php连接mssql完成日志管理

    使用PHP连接MSSQL可实现高效日志管理,首先需安装sqlsrv扩展并配置php.ini;接着通过sqlsrv_connect建立数据库连接,确保SQL Server启用TCP/IP协议;然后创建包含LogLevel、Message、Source等字段的AppLogs表;封装writeLog函数插…

    2026年9月22日
    000
  • laravel如何使用Pipeline模式处理复杂逻辑_Laravel Pipeline模式处理复杂逻辑方法

    Laravel Pipeline通过将复杂流程拆分为多个独立处理步骤,实现代码解耦与职责分离。以用户注册为例,可依次执行发送欢迎邮件、分配角色、记录日志等操作,每个步骤由单独类实现__invoke方法,通过Pipeline::send($user)->through([…])-&g…

    2026年9月22日
    200
  • 消逝的光芒困兽火球术获取与无限使用教程 火球术怎么获取

    在《消逝的光芒:困兽》中,如下图所示位置的桥走到尽头会发现一堵看似无法通过的砖墙,但实际上可以穿过去。穿过之后就能看到一个隐藏区域,里面有一个经典的麦块彩蛋。将显示“Minecraft”字样的方块用武器击碎,随后沿着路径一直前进,最终即可获得制作火球术的配方。 关于火球术的无限使用技巧:释放技能时会…

    2026年9月22日
    100
  • php-gd怎么制作缩略图_php-gd生成高质量缩略图

    使用PHP-GD生成高质量缩略图需保持宽高比、选用imagecopyresampled进行重采样,并合理设置JPEG质量(80-95),同时处理PNG透明通道,避免图像失真或背景变黑。 使用 PHP-GD 制作高质量缩略图,核心在于正确处理图像缩放、保持宽高比、避免失真,并选择合适的图像质量参数。下…

    2026年9月22日
    000
  • PHP日志记录怎么做_PHP中Monolog库实现灵活强大的日志系统

    Monolog是PHP中基于PSR-3标准的主流日志库,通过Composer安装后可轻松实现日志记录。使用Logger类创建实例并添加Handler(如StreamHandler写入文件、NativeMailerHandler邮件报警)来管理不同级别(debug、info、error等)日志输出,支…

    2026年9月22日
    200
  • PHP数组如何定义和使用_PHP数组定义与使用详细教程

    PHP数组是存储和管理多个值的核心工具,支持索引、关联、混合及多维结构;通过方括号定义,可灵活访问、修改、添加或删除元素,并利用foreach高效遍历。 PHP数组是存储一系列值的强大工具,无论这些值是简单的数据项,还是更复杂的结构。它的核心思想就是把一堆相关的数据“打包”在一起,通过一个统一的名字…

    2026年9月22日
    000
  • Java中递归处理列表:排序验证与条件性最大值移除策略

    在处理列表数据时,我们常遇到需要根据特定条件修改列表的需求。本教程将深入探讨一个具体的场景:如何设计一个递归函数,该函数首先判断一个整数列表是否已按升序排序。如果列表已排序,则停止处理;如果未排序,则进一步检查列表中的最大值。仅当最大值位于列表的起始位置或末尾时,才将其移除,并对修改后的列表重复此过…

    2026年9月22日
    000
  • PHPJSON数据怎么解析_PHP处理JSON数据格式

    PHP使用json_decode()解析JSON数据,传入字符串和true参数可转为数组,适用于API响应、文件读取等场景,需配合json_last_error()检查解析是否成功。 PHP解析JSON数据非常简单,主要依靠内置的两个函数:json_decode() 和 json_encode()。…

    2026年9月22日
    100
  • PHP框架日志系统怎么记录错误_PHP框架日志系统配置指南

    PHP框架通过配置日志级别、通道和处理器,结合Monolog库实现错误记录。以Laravel和Symfony为例,可在配置文件中定义多通道(如文件、Slack)、设置不同级别(ERROR、CRITICAL),并通过门面或服务在代码中捕获异常并写入上下文信息。 PHP框架的日志系统记录错误,核心在于通…

    2026年9月22日
    000
  • PHP 数组元素按日期条件过滤与删除:避免常见陷阱

    本教程详细介绍了如何在 PHP 中根据日期条件动态删除数组(或对象数组)中的元素。文章将重点讲解如何正确进行日期比较,特别是当数据源为 JSON 格式时,以及 unset 函数在遍历过程中移除元素时的正确用法,帮助开发者避免常见的字符串日期比较和对象属性访问错误。 简介 在数据处理中,根据特定条件过…

    2026年9月22日
    100
  • MySQL SHOW 语句与预处理参数绑定:深入解析与解决方案

    本文深入探讨了在PHP PDO中尝试使用参数绑定执行SHOW VARIABLES LIKE :var查询时遇到的常见问题。核心原因是MySQL对SHOW类语句的预处理存在限制,导致无法直接绑定参数。文章提供了多种有效的替代方案,包括字符串拼接(需注意安全)以及更推荐的通过WHERE variable…

    2026年9月22日
    600
  • Workerman与PHP协同开发:构建高性能的Web应用程序

    workerman与php协同开发:构建高性能的web应用程序 引言:在今天互联网高速发展的时代,Web应用程序的高性能已成为用户体验和竞争力的重要因素。而PHP作为一种广泛使用的服务器端开发语言,其性能优化一直备受关注。本文将介绍如何利用Workerman与PHP协同开发,从而构建高性能的Web应…

    用户投稿 2026年9月22日
    100
  • 解决PHP扩展缺失错误:phpinfo验证与服务重启指南

    本文旨在解决%ignore_a_1%脚本运行时提示特定扩展(如json、mbstring)缺失的问题,即便用户已在php配置中手动启用。核心解决方案是利用`phpinfo()`函数验证扩展的实际加载状态,并强调在修改php配置后,必须重启相关的web服务器或php-fpm服务,以确保新的配置生效。 …

    2026年9月22日
    400
  • PHP数组中JSON字符串值的解析与访问教程

    本教程将详细指导如何在PHP中处理包含JSON字符串的数组。通过利用json_decode()函数,您可以轻松地将这些JSON字符串转换为可操作的PHP数组,进而提取并访问其中嵌套的shortname、fullname等具体字段,从而实现对复杂数据结构的有效管理和利用。 理解问题:PHP数组中的JS…

    2026年9月22日
    100
  • 递增操作符对PHP类静态属性的影响_PHP静态属性递增行为

    静态属性在PHP中被类的所有实例共享,使用++操作符递增时会修改唯一的内存副本。例如定义计数器属性 $count,每次调用 increment() 方法均使其加1,无论通过哪个对象实例。这种机制适用于统计对象创建次数、追踪全局状态等场景。由于静态属性生命周期贯穿整个请求,递增值持续累积,可能导致内存…

    2026年9月22日
    200
  • 谷歌浏览器官网直接进入 Chrome浏览器官方登录入口

    谷歌浏览器官网直接进入方式为访问https://www.google.com/chrome/,该网站是Chrome官方登录入口,提供跨平台同步、V8引擎加速、地址栏集成搜索、自动填充表单等核心功能,支持极简界面、深色模式、自定义新标签页及侧边栏服务,具备安全浏览、隐私沙盒、密码检查和无痕模式等安全机…

    2026年9月22日
    200
  • 在月球上用肉眼能清晰地看到长城吗?蚂蚁庄园今日答案最新10.24

    或许有的用户还不知道在月球上用肉眼能清晰地看到长城吗?蚂蚁庄园今日答案最新10.24,下面让php的小编为你解答这个问题,快来看看吧! 立即进入“各种好用的网站推荐☜☜☜☜☜点击进入”; 蚂蚁庄园非常好玩,养鸡的同时还能做慈善,增进知识的同时还可以免费领取小鸡饲料。 蚂蚁庄园课堂今天的问题是: 在月…

    2026年9月22日
    1000

发表回复

登录后才能评论
关注微信