PHP中的多维数组分组

PHP中的多维数组分组,php,arrays,grouping,Php,Arrays,Grouping,我现在不能集中注意力,我的头脑一直在用解决这个问题的方法捉弄我 我试过很多种选择,但都不管用。。唉 假设我有一根这样的绳子a.b.c | a.b.d | a.b.e | f | f.g | f.h | i,我想创建一个新数组(或对象),如下所示 A > B > C, D, E F > G, H I 是嵌套数组,,是父数组中的元素 它们应该能够多次继续嵌套,例如a>B>C>D>e>F,D 有什么指导吗?我尝试过将字符串分解,然后将这些字符串分解成一个数组-这个数

我现在不能集中注意力,我的头脑一直在用解决这个问题的方法捉弄我

我试过很多种选择,但都不管用。。唉

假设我有一根这样的绳子
a.b.c | a.b.d | a.b.e | f | f.g | f.h | i
,我想创建一个新数组(或对象),如下所示

A > B > C, D, E    
F > G, H    
I
是嵌套数组,
是父数组中的元素

它们应该能够多次继续嵌套,例如
a>B>C>D>e>F,D

有什么指导吗?我尝试过将字符串分解,然后将这些字符串分解成一个数组-这个数组包含
A>B>C、A>B>D、A>B>E
等等,我就是不知道如何有效地组合它们

我一开始只是在数组中的每个元素上循环,并检查父项的密钥是否存在,但失败了。任何帮助都是非常感谢的,因为我非常累,非常震惊我能做这么简单的任务

<?php

// read line from standard input
$line = trim(fgets(STDIN));

echo "Line: $line\n"; // debug

// split lines by |
$segments = explode('|', $line);

print_r($segments); // debug

// prepare output array
$md_array = array();

// walk through the segments
foreach($segments as $segment) {
    // set pointer to output array
    $current = &$md_array;
    // split segment by .
    $tokens = explode('.', $segment);

    print_r($tokens); // debug

    foreach($tokens as $token) {
        echo "working on $token\n";

        // if key is not included in the array, create empty array
        if( ! array_key_exists($token, $current) ) {
            $current[$token] = array();
        }
        // pass the pointer to following sub-section
        $current = &$current[$token];
    }
}

// print out the output
print_r($md_array);

?>
输出

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

                    [d] => Array
                        (
                        )

                    [e] => Array
                        (
                        )

                )

        )

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

            [h] => Array
                (
                )

        )

    [i] => Array
        (
        )

)

我要感谢理查德的解决方案,这让我实现了我的目标

请参阅下面的代码:

public static function permissions($permList) {
    $segments = explode('|', $permList);
    $md_array = array();
    foreach($segments as $segment) {
        $current = &$md_array;
        $tokens = explode('.', $segment);
        $x = 0;
        foreach($tokens as $token) {                
            if(!array_key_exists($token, $current) ) {
                if(count($tokens) > $x+1)
                    $current[$token] = array();
                else
                    $current[] = $token;
            }
            if(count($tokens) > $x+1)
                $current = &$current[$token];
            $x++;
        }
    }
    return $md_array;
}   
如果输入
a.b.c | a.b.d | a.b.e | f | f.g | f.h | I
,则返回上述预期输出


非常感谢。

您能提供一个输入字符串和期望的数组吗?请向我们展示您的源代码,也许有人发现了错误。我无法计算您的输入字符串与期望的输出如何匹配。如果我理解,您需要
$a=array('b'=>array('c','d','e')使得c、d、e是数组b中的元素,而数组b是数组a的元素。下一个,数组H是数组G的一个元素,它是数组F的一个元素?在你的代码示例中,它不是
F>G,H
?不是我想要的。它不应该创建数组,因为G和H应该是数组,但是字符串是G,字符串是h。如果用POLACH解析结构($No.$ $KEK= $$),并且测试$值是否为空数组,那么可以将$key视为当前节点的项。如果我将每个项作为字符串而不是另一个数组的键,它也会将f作为项,因为列表中只有一个f。如果这是您想要的,那么可以将If(!array_key_exists($token,$current)){$current[$token]=array()}修改为If(!array_key_exists($token,$current)){$current[$token]=array();$current[]=$token;}不,f应该是一个包含两个字符串值的数组-g,h<代码>[f]=>[g',h']
。我可能会想办法在早上编辑它,因为我现在不能。无论如何谢谢你。
public static function permissions($permList) {
    $segments = explode('|', $permList);
    $md_array = array();
    foreach($segments as $segment) {
        $current = &$md_array;
        $tokens = explode('.', $segment);
        $x = 0;
        foreach($tokens as $token) {                
            if(!array_key_exists($token, $current) ) {
                if(count($tokens) > $x+1)
                    $current[$token] = array();
                else
                    $current[] = $token;
            }
            if(count($tokens) > $x+1)
                $current = &$current[$token];
            $x++;
        }
    }
    return $md_array;
}