PHP在树结构中转换字符串的关联数组

时间:2015-02-02 19:14:29

标签: php tree

我有一个路径列表(只是字符串),如下所示:

$data = array(
    array('path' => 'foo/bar/baz'),
    array('path' => 'foo/bar/baz/qux'),
    array('path' => 'foo/bar'),
    array('path' => 'bar/baz/foo'),
    array('path' => 'baz'),
);

我想实现这样的结构

Array
(
    [foo] => Array
        (
            [bar] => Array
                (
                    [baz] => Array
                        (
                            [qux] => null
                        )
                )
        )
    [bar] => Array
        (
            [baz] => Array
                (
                    [foo] => null
                )
        )
    [baz] => null
)

旁注

  1. 结构仅显示非共同部分
  2. 叶子为nullnull对我来说没有孩子)
  3. 我知道你会问我what have you tried?问题是: 我不知道如何以正确的方式解决问题

    你可以给我一些建议,而不是大肆宣传吗?

2 个答案:

答案 0 :(得分:2)

我非常接近,但不是结尾null,而是数组的大小为0。

<?php

function ProcessPath($entry,$depth,&$current)
{
  if($depth<count($entry))
  {
    $key = $entry[$depth];
    if(!isset($current[$key]))$current[$key] = null;
    ProcessPath($entry,$depth+1,$current[$key]);
  }
}


$data = array(
  array('path' => 'foo/bar/baz'),
  array('path' => 'foo/bar/baz/qux'),
  array('path' => 'foo/bar'),
  array('path' => 'bar/baz/foo'),
  array('path' => 'baz'),
);
$result = null;
foreach($data as $path)
{
  ProcessPath(explode("/",$path['path']),0,$result);
}

print_r($result);

?>

输出

Array
(
    [foo] => Array
        (
            [bar] => Array
                (
                    [baz] => Array
                        (
                            [qux] => 
                        )

                )

        )

    [bar] => Array
        (
            [baz] => Array
                (
                    [foo] => 
                )

        )

    [baz] => 
)

基本上是ProcessPath采用的函数:

  • 分割路径的数组
  • 目前的深度,例如:[foo](0)或foo > [bar](1)或foo > bar > [baz](2)
  • 对数组中路径放置位置的引用(由&$reference
  • 表示

首先关闭函数检查深度是否在当前正在处理的路径中。

然后它提取$key以简化其余代码。

这就是魔术发生的地方,如果输出没有设置当前路径段,它会设置它。

最后一行通过采用相同的$entry,将$entry增加1并将$depth更改为新的$current来递归到路径$current[$key]中的下一个元素第{{1}}节。

答案 1 :(得分:0)

您可以做的是迭代路径,爆炸每个路径的字符串,然后根据值的位置将每个值添加到新数组。如果该值是第一个,则它将成为基础。如果它是第二个,那么它将作为第一个内部的新数组进入,依此类推。