【问题标题】:String, tree separated only with commas to an multidimensional php array字符串,树仅用逗号分隔到多维 php 数组
【发布时间】:2013-10-12 19:05:47
【问题描述】:

我有一个这样的字符串:

a,,b,c,,d,,,e,f,g,,e,,,,

我想要一个这样的数组:

Array
(
    [a] => Array
        (
        )

    [b] => Array
        (
            [c] => Array
                (
                )

            [d] => Array
                (
                )

        )

    [e] => Array
        (
            [f] => Array
                (
                    [g] => Array
                        (
                        )

                    [e] => Array
                        (
                        )

                )

        )

)

逻辑是:一个项目后第一个逗号打开该项目,第二个将关闭该项目,两个逗号之间的所有内容都是它的子项。

我做了这个函数:

function source() {
    global $get;
    $items = array();
    $item = true;
    while ($item) {
        $pieces = explode(',', $get, 2);
        if (!empty($pieces[1])) $get = $pieces[1];
        $item = $pieces[0];
        if ($item) $items[$item] = source();
    }
    return $items;
}
$get = 'a,,b,c,,d,,,e,f,g,,e,,,,';
print_r (source());

我仍然遇到一些问题,例如如果字符串以 item 加逗号或没有逗号结束,我会得到一个无限循环。我知道我可以检查是否有足够的逗号并在调用函数之前添加它们,但我不喜欢我的函数。我知道有人在这方面比我更好。所以我问:

将字符串(树,仅用逗号分隔)转换为多维数组()的最佳解决方案是什么?

附言我不确定这是否是最好的询问方式。

【问题讨论】:

    标签: php arrays string data-structures multidimensional-array


    【解决方案1】:
    function parse_tree($str) {
        $base_arr = array();
        $arr = &$base_arr;
        $stack = array();
        foreach (explode(',', $str) as $char) {
            if ($char !== '') {
                $arr[$char] = array();
                $stack[] = &$arr;
                $arr = &$arr[$char];
            } elseif ($stack && $char === '') {
                $tmp = array_slice($stack, -1, 1);
                $arr = &$tmp[0];
                array_pop($stack);
            }
        }
        return $base_arr;
    }
    

    在键盘上运行良好:http://codepad.org/PwKFfQfD

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多