首頁  >  問答  >  主體

展平樹形數組並映射為新的數組格式s key => value的PHP方法

<p>我有一个在php中的复杂数组,像这样:</p> <pre class="brush:php;toolbar:false;">[ 0 => [ 'id' => '2' 'parent_id' => '1' 'text' => 'Algoritma' 'lvl' => '1' 'nodes' => [ 0 => [ 'id' => '11' 'parent_id' => '2' 'text' => 'Flowchart' 'lvl' => '2' 'href' => '/site/read-by-type?id=11' ] 1 => [ 'id' => '12' 'parent_id' => '2' 'text' => 'Pseudo code' 'lvl' => '2' 'href' => '/site/read-by-type?id=12' ] ] 'href' => '/site/read-by-type?id=2' ] 1 => [ 'id' => '3' 'parent_id' => '1' 'text' => 'Pemrograman' 'lvl' => '1' 'nodes' => [ 0 => [ 'id' => '4' 'parent_id' => '3' 'text' => 'Java' 'lvl' => '2' 'href' => '/site/read-by-type?id=4' ] 1 => [ 'id' => '5' 'parent_id' => '3' 'text' => 'PHP' 'lvl' => '2' 'nodes' => [ 0 => [ 'id' => '8' 'parent_id' => '5' 'text' => 'Yii2 Framework' 'lvl' => '3' 'href' => '/site/read-by-type?id=8' ] 1 => [ 'id' => '9' 'parent_id' => '5' 'text' => 'Laravel' 'lvl' => '3' 'href' => '/site/read-by-type?id=9' ] ] 'href' => '/site/read-by-type?id=5' ] 2 => [ 'id' => '7' 'parent_id' => '3' 'text' => 'Javascript' 'lvl' => '2' 'href' => '/site/read-by-type?id=7' ] ] 'href' => '/site/read-by-type?id=3' ] 2 => [ 'id' => '10' 'parent_id' => '1' 'text' => 'Sistem Operasi' 'lvl' => '1' 'nodes' => [ 0 => [ 'id' => '13' 'parent_id' => '10' 'text' => 'Mac OS' 'lvl' => '2' 'href' => '/site/read-by-type?id=13' ] 1 => [ 'id' => '14' 'parent_id' => '10' 'text' => 'Linux' 'lvl' => '2' 'href' => '/site/read-by-type?id=14' ] ] 'href' => '/site/read-by-type?id=10' ] ]</pre> <p>我需要将这些数组展平为键值对的格式,即 ['id' => 'text']:</p> <pre class="brush:php;toolbar:false;">[ 2 => ' Algoritma' // 基于这些级别,有1个空格 11 => ' Flowchart', // 基于这些级别,有2个空格 12 => ' Pseudo code', // 基于这些级别,有2个空格 3 => ' Pemrograman' // 基于这些级别,有1个空格 4 => ' Java' // 基于这些级别,有2个空格 5 => ' PHP' // 基于这些级别,有2个空格 8 => ' Yii2 Framework' // 基于这些级别,有3个空格 9 => ' Laravel' // 基于这些级别,有3个空格 10 => ' Sistem Operasi' // 基于这些级别,有1个空格 ... 以此类推 ]</pre> <p>到目前为止,我写了这样的代码:</p> <pre class="brush:php;toolbar:false;">public static function flattingTree(array $tree){ $denormalizeTree = []; foreach ($tree as $node) { if(isset($node['nodes'])){ // 我被卡住了... } $denormalizeTree[$node['id']] = $node['text']; } return $denormalizeTree; }</pre> <p>但我只得到了一层:</p> <pre class="brush:php;toolbar:false;">[ 2 => 'Algoritma' 3 => 'Pemrograman' 10 => 'Sistem Operasi' ]</pre> <p>非常感谢任何帮助...</p>
P粉563831052P粉563831052435 天前528

全部回覆(2)我來回復

  • P粉043470158

    P粉0434701582023-09-04 14:57:41

    你比你想像的更接近。只需遞歸呼叫你的函數,並將結果加入最終數組。

    public function flattingTree(array $tree)
    {
        $denormalizeTree = [];
        foreach ($tree as $node) {
            if (isset($node['nodes'])) {
                $denormalizeTree += $this->flattingTree($node['nodes']);
            }
            $denormalizeTree[$node['id']] = $node['text'];
        }
    
        return $denormalizeTree;
    }

    結果:

    $result = $this->flattingTree($array); 
    print_r($result);
    
    Array
    (
        [11] => Flowchart
        [12] => Pseudo code
        [2] => Algoritma
        [4] => Java
        [8] => Yii2 Framework
        [9] => Laravel
        [5] => PHP
        [7] => Javascript
        [3] => Pemrograman
        [13] => Mac OS
        [14] => Linux
        [10] => Sistem Operasi
    )

    回覆
    0
  • P粉807397973

    P粉8073979732023-09-04 13:40:19

    一個快速的解決方案是使用遞歸函數遍歷數組並將所需資料加入最終數組。

    關鍵在於有一個函數接受「未展開」的陣列和一個變數來保存資料(資料將保存在該變數中)。最後一個參數將透過引用傳遞,以便變數本身被改變,從而將資料保存在其中。

    function extract($arr, &$saveInto) {
        foreach ($arr as $el) {
            isset($el['id'], $el['text']) && ($saveInto[$el['id']] = $el['text']);
            isset($el['nodes']) && extract($el['nodes'], $saveInto); // 递归调用
        }
    }

    使用上述函數,可以透過呼叫它並指定一個變數來展開陣列以保存結果。

    $unflattenedArr = [ ... ]; // 要展开的数组
    $finalArr = []; // 将保存结果的数组
    extract($unflattenedArr, $finalArr);
    // 此时 $finalArr 中保存了所需的结果。

    為了讓事情更簡單,可以封裝 extract 函數,不再需要準備一個空數組來保存結果。

    function flatten($arr) {
        $r = []; // 此函数准备一个空变量
        extract($arr, $r); // 将其传递给“extract”函数
        return $r; // 然后返回带有所需结果的变量
    }

    現在,可以以下方式展開陣列:

    $unflattenedArr = [ ... ]; // 要展开的数组
    $finalArr = flatten($unflattenedArr); // 调用封装了“extract”函数的新函数
    // 此时 $finalArr 中保存了所需的结果。

    希望我已經幫助你進一步了。

    回覆
    0
  • 取消回覆