Построить дерево

Discussion in 'PHP' started by rudi, 6 Dec 2018.

  1. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    186
    Reputations:
    5
    Вопрос на засыпку.
    Есть массив, из которого следует построить многомерный массив-дерево.
    Как бы вы реализовали?
    Code:
    $array[]='Top';
    $array[]='Top.Science';
    $array[]='Top.Science.Astronomy';
    $array[]='Top.Science.Astronomy.Astrophysics';
    $array[]='Top.Science.Astronomy.Cosmology';
    $array[]='Top.Hobbies';
    $array[]='Top.Hobbies.Amateurs_Astronomy';
    $array[]='Top.Collections';
    $array[]='Top.Collections.Pictures';
    $array[]='Top.Collections.Pictures.Astronomy';
    $array[]='Top.Collections.Pictures.Astronomy.Stars';
    $array[]='Top.Collections.Pictures.Astronomy.Galaxies';
    $array[]='Top.Collections.Pictures.Astronomy.Astronauts';
    На выходе должны получить многомерный ассоциативный массив вида
    Code:
         
                           Top
                        /   |  \
                Science Hobbies Collections
                    /       |              \
           Astronomy   Amateurs_Astronomy Pictures
              /  \                            |
    Astrophysics  Cosmology                Astronomy
                                           /  |    \
                                    Galaxies Stars Astronauts
    
    
     
    #1 rudi, 6 Dec 2018
    Last edited: 6 Dec 2018
  2. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    683
    Likes Received:
    1,513
    Reputations:
    460
    Грязный хак :)
    PHP:
    $result = [];

    foreach(
    $array as $a)
       eval(
    '$result["'.str_replace('.','"]["',$a).'"]=[];');

    print_r($result);
    Code:
    Array
    (
        [Top] => Array
            (
                [Science] => Array
                    (
                        [Astronomy] => Array
                            (
                                [Astrophysics] => Array
                                    (
                                    )
    
                                [Cosmology] => Array
                                    (
                                    )
    
                            )
    
                    )
    
                [Hobbies] => Array
                    (
                        [Amateurs_Astronomy] => Array
                            (
                            )
    
                    )
    
                [Collections] => Array
                    (
                        [Pictures] => Array
                            (
                                [Astronomy] => Array
                                    (
                                        [Stars] => Array
                                            (
                                            )
    
                                        [Galaxies] => Array
                                            (
                                            )
    
                                        [Astronauts] => Array
                                            (
                                            )
    
                                    )
    
                            )
    
                    )
    
            )
    
    )
    
    
     
    rudi and failsafe like this.
  3. failsafe

    failsafe Member

    Joined:
    1 Apr 2016
    Messages:
    35
    Likes Received:
    10
    Reputations:
    2
    Вариант без подлого eval :) :

    PHP:
    function process(&$el$nodes) {
        
    $node array_shift($nodes);
        if (empty(
    $node)) return;
        if (!isset(
    $el[$node])) $el[$node] = array();
        
    process($el[$node], $nodes);
    }

    $tree = array();

    foreach (
    $array as $nodes) {
        
    process($treeexplode('.'$nodes));
    }

    echo 
    '<pre>';
    print_r($tree);
     
    rudi, winstrool and crlf like this.
  4. failsafe

    failsafe Member

    Joined:
    1 Apr 2016
    Messages:
    35
    Likes Received:
    10
    Reputations:
    2
    OMG, хотя зачем эта подлая рекурсия :) (теоретически, рекурсия может вызвать переполнение стека , если ветка дерева очень длинная)
    PHP:
    $tree = array();

    foreach (
    $array as $nodes) {
        
    $el = &$tree;
        foreach (
    explode('.'$nodes) as $node) {
            isset(
    $el[$node]) or $el[$node] = array();
            
    $el = &$el[$node];
        }
    }

    echo 
    '<pre>';
    print_r($tree);
     
  5. artkar

    artkar Well-Known Member

    Joined:
    14 Nov 2016
    Messages:
    350
    Likes Received:
    331
    Reputations:
    6
    Каждый пограмист должен построить дерево, создать сына , от класса Отца и всё! ДОм строить не нада