2015-10-05 97 views
1

我现在不能集中精力,我的大脑一直在用我的解决方案来玩弄技巧。在PHP中对多维数组进行分组

我试了很多选择,但他们一直不工作..感叹。

说我有一个字符串, 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等等,我只是无法理解如何有效地组合它们。

我刚刚循环遍历数组中的每个元素并检查父项的键是否存在,但那是失败的。任何帮助都会受到赞赏,因为我非常疲倦,相当令人震惊,我可以做这么简单的任务。

+0

你能提供一个输入字符串和预期的数组吗? –

+2

请向我们显示您的源代码,也许有人发现了错误。 – RhinoDevel

+0

我无法弄清楚你的输入字符串如何匹配你的预期输出。 – Gravy

回答

1
<?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); 

?> 

测试脚本

echo "a.b.c|a.b.d|a.b.e|f|f.g|f.h|i" | php test.php 

输出

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

        [d] => Array 
         (
         ) 

        [e] => Array 
         (
         ) 

       ) 

     ) 

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

      [h] => Array 
       (
       ) 

     ) 

    [i] => Array 
     (
     ) 

) 
+0

不是我想要的。它不应该创建数组,因为在g和h应该是数组,但字符串'g'和字符串'h'。 – Profile

+0

如果使用foreach解析结构($ node为$ key => $ value)并测试$ value是否为空数组,则可以将$ key视为当前节点的项目。如果我将每个项目作为一个字符串而不是另一个数组的键,那么它将把f也作为一个项目,因为列表中只有一个f。如果这就是你想要的,那么你可以修改if(!array_key_exists($ token,$ current)){current = $ [token] = array(); } if(!array_key_exists($ token,$ current)){ $ current [$ token] = array(); $ current [] = $ token; } – Richard

+0

不,f应该是一个包含两个字符串值 - g,h的数组。 '[f] => ['g','h']'。我可能会想方设法在早上编辑它,因为我现在不行。无论如何,谢谢。 – Profile

0

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

请参见下面的代码:

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,我与预期输出上面返回。

非常感谢。