2015-10-05 86 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,我與預期輸出上面返回。

非常感謝。