【问题标题】:PHP explode strings in array to multidimensional arrayPHP将数组中的字符串分解为多维数组
【发布时间】:2018-07-10 12:12:42
【问题描述】:

我已经看到了很多关于这个主题的问题,但没有任何接近我的案例。

我喜欢一个非常简单的文件夹路径作为键,并希望将数组变成多维数组。

我当前的数组

[
  'projects'                  => 'A path',
  'projects/project-a'        => 'Another path',
  'projects/project-b'        => 'Yet another path',
  'about/me/and/someone/else' => 'Path about me'
]

这是我尝试得到的结果:

[
  'projects' => [
    'path'     => 'A path',
    'children' => [
      'project-a' => [
        'path' => 'Another path'
      ],
      'project-b' => [
        'path' => 'Yet another path'
      ]
    ]
  ],
  'about' => [
    'children' => [
      'me' => [
        'children' => [
          'and' => [
            'children' => [
              'someone' => [
                'children' => [
                  'else' => [
                    'path' => 'Path about me'
                  ]
                ]
              ]
            ]
          ]
        ]
      ]
    ]
  ]
]

也许我可以以某种方式使用array_walk_recursive。我知道explode 可以用来分割/ 的部分。

备注

  • projects/project-a 没有孩子。
  • about 和除了最后一个之外的所有孩子都没有路径。
  • 阵列的深度未知。

【问题讨论】:

  • 先尝试自己,如果做不到,请提出问题并展示您的尝试。
  • 是的,您可以通过一些调整来使用爆炸。正如@KIKOSoftware 所说,您需要自己尝试一下
  • 这很容易解决。从我的头顶来看,最快的方法是使用嵌套的 foreach 和 explode 遍历每个的根。如果您正在索引互联网,您可能需要对访问的路径进行哈希处理,并可能尝试找到它们 O(1) 并从那里构建。由于您的列表已排序,这似乎微不足道。

标签: php arrays recursion multidimensional-array explode


【解决方案1】:
$result = [];

foreach($arr as $k=>$v) {
  $path = explode('/', $k);
  // temporary array for one path
  $temp = [];
  // Pointer, used to add a next level 
  $p = &$temp;
  // Save the last part of path
  $last = array_pop($path);
  foreach($path as $s) {
    // Make level upto the last
    $p[$s] = ['children' => []];
    $p = &$p[$s]['children'];
  }
 // Add a value 
 $p[$last] = ['path' => $v];
 $result = array_merge_recursive($result, $temp);
}
print_r($result);

demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 2023-03-08
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多