簡體   English   中英

在PHP中對多維數組進行分組

[英]Grouping multi-dimensional arrays in PHP

我現在無法集中精力,我的腦子一直在想辦法解決這個問題。

我嘗試了多種選擇,但它們仍然無法正常工作。

說我有這樣的字符串; abc|abd|abe|f|fg|fh|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然后將這些字符串A > B > C, A > B > D, A > B > E為數組-該數組包含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);

?>

測試腳本

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
        (
        )

)

感謝Richard的解決方案,它使我得以實現自己的目標。

請參見下面的代碼:

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;
}   

如果我輸入abc|abd|abe|f|fg|fh|i ,則返回上面的預期輸出。

非常感謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM