PHP从具有关系数据的数组创建多维数组[重复]

2023-11-23

可能的重复:
根据父 ID 值将数组从一维转换为多维

我正在 PHP 工作。

我有以下包含关系数据(父子关系)的数组。

Array        
(        
    [5273] => Array        
        (        
            [id] => 5273        
            [name] => John Doe        
            [parent] =>         
        )        

    [6032] => Array        
        (        
            [id] => 6032        
            [name] => Sally Smith        
            [parent] => 5273        
        )        

    [6034] => Array        
        (        
            [id] => 6034        
            [name] => Mike Jones        
            [parent] => 6032        
        )        

    [6035] => Array        
        (        
            [id] => 6035        
            [name] => Jason Williams        
            [parent] => 6034        
        )        

    [6036] => Array        
        (        
            [id] => 6036        
            [name] => Sara Johnson        
            [parent] => 5273        
        )        

    [6037] => Array        
        (        
            [id] => 6037        
            [name] => Dave Wilson        
            [parent] => 5273        
        )        

    [6038] => Array        
        (        
            [id] => 6038        
            [name] => Amy Martin        
            [parent] => 6037        
        )        
)        

我需要它采用以下 JSON 格式:

{        
   "id":"5273",        
   "name":"John Doe",        
   "data":{        

   },        
   "children":[        
      {        
         "id":" Sally Smith",        
         "name":"6032",        
         "data":{        

         },        
         "children":[        
            {        
               "id":"6034",        
               "name":"Mike Jones",        
               "data":{        

               },        
               "children":[        
                  {        
                     "id":"6035",        
                     "name":"Jason Williams",        
                     "data":{        

                     },        
                     "children":[        
                        {        
                           "id":"node46",        
                           "name":"4.6",        
                           "data":{        

                           },        
                           "children":[        

                           ]        
                        }        
                     ]        
                  }        
               ]        
            },        
            {        
               "id":"6036",        
               "name":"Sara Johnson",        
               "data":{        

               },        
               "children":[        

               ]        
            },        
            {        
               "id":"6037",        
               "name":"Dave Wilson",        
               "data":{        

               },        
               "children":[        
                  {        
                     "id":"6038",        
                     "name":"Amy Martin",        
                     "data":{        

                     },        
                     "children":[        

                     ]        
                  }        
               ]        
            }        
         ]        
      }        
   ]        
}        

我知道我需要创建一个多维数组并通过 json_encode() 运行它。我还相信用于执行此操作的方法需要递归,因为现实世界的数据可能具有未知数量的级别。

我很乐意展示我的一些方法,但它们没有奏效。

谁能帮我?

我被要求分享我的工作。这是我尝试过的,但我还没有接近我不知道它有多大帮助。

我只列出了一系列关系。

foreach($array as $k => $v){
    $relationships[$v['id']] = $v['parent'];
}

我认为(基于另一篇 SO 文章)使用此关系数据来创建一个新的多维数组。如果我让它工作,我将努力添加正确的“儿童”标签等。

$childrenTable = array();
    $data = array();
    foreach ($relationships as $n => $p) {
      //parent was not seen before, put on root
      if (!array_key_exists($p, $childrenTable)) {
          $childrenTable[$p] = array();
          $data[$p] = &$childrenTable[$p];  
      }
      //child was not seen before
      if (!array_key_exists($n, $childrenTable)) {
          $childrenTable[$n] = array();
      }
      //root node has a parent after all, relocate
      if (array_key_exists($n, $data)) {
          unset($data[$n]);
      }
      $childrenTable[$p][$n] = &$childrenTable[$n];      
    }
    unset($childrenTable);

print_r($data);

<?php
header('Content-Type: application/json; charset="utf-8"');

/**
 * Helper function
 * 
 * @param array   $d   flat data, implementing a id/parent id (adjacency list) structure
 * @param mixed   $r   root id, node to return
 * @param string  $pk  parent id index
 * @param string  $k   id index
 * @param string  $c   children index
 * @return array
 */
function makeRecursive($d, $r = 0, $pk = 'parent', $k = 'id', $c = 'children') {
  $m = array();
  foreach ($d as $e) {
    isset($m[$e[$pk]]) ?: $m[$e[$pk]] = array();
    isset($m[$e[$k]]) ?: $m[$e[$k]] = array();
    $m[$e[$pk]][] = array_merge($e, array($c => &$m[$e[$k]]));
  }

  return $m[$r][0]; // remove [0] if there could be more than one root nodes
}

echo json_encode(makeRecursive(array(
  array('id' => 5273, 'parent' => 0,    'name' => 'John Doe'),  
  array('id' => 6032, 'parent' => 5273, 'name' => 'Sally Smith'),
  array('id' => 6034, 'parent' => 6032, 'name' => 'Mike Jones'),
  array('id' => 6035, 'parent' => 6034, 'name' => 'Jason Williams'),
  array('id' => 6036, 'parent' => 5273, 'name' => 'Sara Johnson'),
  array('id' => 6037, 'parent' => 5273, 'name' => 'Dave Wilson'),
  array('id' => 6038, 'parent' => 6037, 'name' => 'Amy Martin'),
)));

demo: https://3v4l.org/s2PNC

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP从具有关系数据的数组创建多维数组[重复] 的相关文章

随机推荐

  • 限制完成时的 IntelliJ IDEA 导入建议

    当我输入需要导入的类的名称时 IntelliJ 会亲切地弹出一个建议列表 然而 大多数时候 这些建议是我永远不想导入的东西 尤其是偶然的 比如java awt 有没有办法防止我永远不会导入的包出现在完成列表中 我已经搜索了这些选项 但没有找
  • 使用 MPI_Bcast 进行 MPI 通信

    我正在尝试使用 MPI Bcast 将消息从根节点广播到所有其他节点 然而 每当我运行这个程序时 它总是在开始时挂起 有人知道这是怎么回事吗 include
  • Cassandra 中的高基数和低基数

    我不断遇到这些术语 high cardinality and low cardinality in Cassandra 我不明白它们到底是什么意思 它们对查询有什么影响以及首选是什么 请举例说明 因为这样很容易理解 X 的基数只不过是组成
  • 使用 powershell 将路径永久添加到 Windows 似乎不起作用

    我跟着这个程序为了使用 powershell 永久添加 SumatraPDF 的路径 链接中的最后几个命令旨在检查路径是否确实已添加 当我使用以下命令访问路径时 get itemproperty path Registry HKEY LOC
  • ggplot2:将不连续的持续时间绘制为条形图

    我使用 ggplot 将各种事件绘制为事件开始的日期 x 轴 和开始时间 y 轴 的函数 数据 代码如下 date lt c 2013 06 05 2013 06 05 2013 06 04 2013 06 04 2013 06 04 20
  • 互补误差函数 erfcf() 的可向量化实现

    互补误差函数 erfc 是与标准正态分布密切相关的特殊函数 它经常用于统计学和自然科学 例如扩散问题 其中需要考虑该分布的 尾部 并使用误差函数 erf 因此不适合 ISO C99 标准数学库中提供了互补误差函数 如下所示 erfcf er
  • 并发集合在没有 Thread.Sleep 的情况下消耗了太多 cpu

    两者的正确用法是什么 BlockingCollection or ConcurrentQueue这样您就可以自由地将项目出列 而不会使用线程消耗一半或更多的 CPU 资源 我使用 2 个线程运行一些测试 除非我的 Thread Sleep
  • Angular2 异常:TypeError el.createShadowRoot 不是函数(Safari/Edge)

    我有一个 angular2 应用程序 在 Chrome 和 Firefox 中运行良好 但在 Safari 中我收到此错误 TypeError el createShadowRoot 不是函数 Edge 中也类似 对象不支持属性或方法 cr
  • jQuery 模式对话框未提交我的表单

    我正在使用 jQuery 模态对话框询问用户是否希望提交表单 但是 在用户单击对话框的 提交 按钮后 表单并未提交 如果我再次单击表单提交按钮 它就会提交 我猜这是一个范围问题 我看过其他一些关于它的帖子 但到目前为止已经花了很多时间但没有
  • 如何使用 Cloud Functions for Firebase 预渲染页面以进行 SEO?

    Firebase 文档的 Cloud Functionshere指出这可以使用云函数来完成 预渲染单页应用程序以改善 SEO 这允许您创建动态元标签以在各种社交网络上共享 我有两个问题 有人可以举例说明如何实现预渲染吗 它如何与 Fireb
  • JQuery中点击容器内元素时如何取消容器div触发的点击事件?

    E g div class container div class inside I am not fire when click me div div container click function container do somet
  • @@IDENTITY、SCOPE_IDENTITY()、OUTPUT 和其他检索最后身份的方法

    我见过在插入后检索主键标识字段的值时使用的各种方法 declare t table id int identity primary key somecol datetime default getdate insert into t def
  • 在 Visual Studio 2010 中查找类后代

    我正在 Visual Studio 2010 的对象浏览器中查看一个抽象类 我想找到从这个抽象类派生的所有类 这样我就可以选择最好的一个来在我的应用程序中实现 我没有该程序集的源代码 因此无法使用在文件中查找功能 不幸的是 我似乎根本不知道
  • 基于另一个列表的 1 个列表的流过滤器

    我在这个论坛和谷歌搜索后发布我的查询 但无法解决相同的问题 例如 Link1 Link2 Link3 我正在尝试根据列表 1 中的值过滤列表 2 多列 List1 Datsun Volvo BMW Mercedes List2 1 Jun
  • 将通用过程作为实际参数传递给函数

    我试图将通用过程作为实际参数传递给函数 module mymod implicit none interface func module procedure func1 module procedure func2 endinterface
  • Ionic 2:使用 Cordova 插件

    我做了很多谷歌搜索 但似乎无法找到太多答案 在 Ionic 2 中调用 Cordova 插件的语法是如何工作的 例如 在 Ionic 1 中 我正在使用 Facebook 插件 我会这样称呼它 cordovaFacebook login p
  • 按字母顺序对选择菜单进行排序?

    我有以下选择菜单 jsFiddle
  • Hive解释计划理解

    是否有任何适当的资源可以让我们完全理解 hive 生成 的解释计划 我尝试在 wiki 中搜索它 但找不到完整的指南来理解它 这是 wiki 它简要解释了解释计划的工作原理 但我需要有关如何推断解释计划的更多信息 https cwiki a
  • 如何将日期作为 URL 参数传递

    我正在使用钛通过网络服务为特定的网络应用程序创建一些应用程序 这里我将日期作为 URL 参数传递来调用 java 中的特定 webservice 方法 日期格式如下 2015 02 04T05 10 58 05 30 在java服务方法中
  • PHP从具有关系数据的数组创建多维数组[重复]

    这个问题在这里已经有答案了 可能的重复 根据父 ID 值将数组从一维转换为多维 我正在 PHP 工作 我有以下包含关系数据 父子关系 的数组 Array 5273 gt Array id gt 5273 name gt John Doe p