【问题标题】:Converting a One-Dimensional Array into a Nested Array Using Relationship Keys使用关系键将一维数组转换为嵌套数组
【发布时间】:2012-07-19 13:27:41
【问题描述】:

假设我有一个数组,其中键代表id,值代表parent

4  => 0
2  => 0
5  => 2
6  => 5
8  => 0
9  => 0
10 => 8
12 => 0
13 => 0
14 => 0
18 => 7
19 => 18
20 => 19
21 => 20
22 => 21
23 => 22
24 => 23
28 => 20
7  => 5

你也可以把它当作一个对象来读:

  { 
   id     : 4,
   parent : 0
  } // etc...

我想由此实现的多维数组是:

4  => 0
2  => 5  
        => 6
        => 7
            => 18
                 => 19
                      => 20
                           => 21
                                 => 22
                                       => 23
                                             => 24
                           => 28
8  => 10
9  => 0
12 => 0
13 => 0
14 => 0

我该怎么做呢?

【问题讨论】:

  • 看起来像 Graph(在计算机科学中)?
  • 当然闻起来像家庭作业
  • 在排序后的数组中看起来很“重”

标签: php object language-agnostic multidimensional-array


【解决方案1】:

如果您编写一个小辅助函数来将您的数据重新加工成类似于以下的结构:

$input = array(
  array('id' => '4', 'parent' => '0'),
  // ...
);

这可以通过以下方式实现:

$data = array_map(function ($entry) {
  list($id, $parent) = array_map('trim', explode('=>', $entry));
  return array(
    'id' => $id,
    'parent' => $parent
  );
}, explode("\n", $data));

然后你可以使用我在类似question 中使用的函数:

function flatToNested($d, $r = 0, $p = 'parent', $k = 'id', $c = 'children') {
  $m = array();
  foreach ($d as $e) {
    isset($m[$e[$p]]) ?: $m[$e[$p]] = array();
    isset($m[$e[$k]]) ?: $m[$e[$k]] = array();
    $m[$e[$p]][] = array_merge($e, array($c => &$m[$e[$k]]));
  }
  return $m[$r];
}

生成嵌套数组:

$nested = flatToNested($data);

演示:http://codepad.viper-7.com/HAZxaA

【讨论】:

  • 如果值是字符串,即id=>'node-4',parent='node-0',而不是 id=4 等怎么办?如何修改此功能?
  • @Patrick 我不认为这应该是一个问题,只要它们是唯一的flatToNested 会正确处理它。
  • @Patrick try: $nested = flatToNested($doesntwork, 'node0'); $r 参数到flatToNested 选择要返回的根节点。
猜你喜欢
  • 2016-12-16
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 2015-12-22
相关资源
最近更新 更多