Frage Konvertieren Sie ein flaches Array in ein multidimensionales Array


Ich habe ein Array mit Baumdaten (nach Eltern-ID). Ich möchte es in ein mehrdimensionales Array konvertieren. Was ist der beste Weg, um das zu erreichen? Gibt es dafür eine kurze Funktion?

Quell-Array:

$source = array(
    '0' => array(
            'Menu' => array(
                    'id' => 45
                    'name' => 'Home'
                    'parent_id' => 1
            )
    )
    '1' => array(
            'Menu' => array(
                    'id' => 47
                    'name' => 'Get started'
                    'parent_id' => 1
            )
    )
    '2' => array(
            'Menu' => array(
                    'id' => 72
                    'name' => 'Attributes'
                    'parent_id' => 71
            )
    )
    '3' => array(
            'Menu' => array(
                    'id' => 73
                    'name' => 'Headings'
                    'parent_id' => 71
            )
    )
    '4' => array(
            'Menu' => array(
                    'id' => 75
                    'name' => 'Links'
                    'parent_id' => 71
            )
    )
    '5' => array(
            'Menu' => array(
                    'id' => 59
                    'name' => 'Images'
                    'parent_id' => 75
            )
    )
    '6' => array(
            'Menu' => array(
                    'id' => 65
                    'name' => 'Lists'
                    'parent_id' => 75
            )
    )
);

Einige Eltern fehlen im Quell-Array. Ich möchte, dass die Elemente mit fehlenden Eltern root sind. Ergebnis-Array:

$result = array(
    '0' => array(
            'Menu' => array(
                    'id' => 45
                    'name' => 'Home'
                    'parent_id' => 1
            )
            'Children' => array()
    )
    '1' => array(
            'Menu' => array(
                    'id' => 47
                    'name' => 'Get started'
                    'parent_id' => 1
            )
            'Children' => array()
    )
    '2' => array(
            'Menu' => array(
                    'id' => 72
                    'name' => 'Attributes'
                    'parent_id' => 71
            )
            'Children' => array()
    )
    '3' => array(
            'Menu' => array(
                    'id' => 73
                    'name' => 'Headings'
                    'parent_id' => 71
            )
            'Children' => array()
    )
    '4' => array(
            'Menu' => array(
                    'id' => 75
                    'name' => 'Links'
                    'parent_id' => 71
            )
            'Children' => array(
                    '0' => array(
                        'Menu' => array(
                            'id' => 59
                            'name' => 'Images'
                            'parent_id' => 75
                        )
                        'Children' => array()
                    )
                    '1' => array(
                        'Menu' => array(
                            'id' => 65
                            'name' => 'Lists'
                            'parent_id' => 75
                        )
                        'Children' => array()
                   )
            )
     )
);

Update: entfernte eckige Klammern.


7
2017-07-16 01:03


Ursprung


Antworten:


Ich denke nicht, dass es eine eingebaute Funktion in PHP gibt, die das tut.

Ich habe den folgenden Code ausprobiert, und es scheint zu funktionieren, das verschachtelte Array wie beschrieben vorzubereiten:

$nodes = array();
$tree = array();
foreach ($source as &$node) {
  $node["Children"] = array();
  $id = $node["Menu"]["id"];
  $parent_id = $node["Menu"]["parent_id"];
  $nodes[$id] =& $node;
  if (array_key_exists($parent_id, $nodes)) {
    $nodes[$parent_id]["Children"][] =& $node;
  } else {
    $tree[] =& $node;
  }
}

var_dump($tree);

Ich habe einen ähnlichen Algorithmus in einer PHP-Klasse geschrieben, die ich für meine Präsentation geschrieben habe Hierarchische Modelle in SQL und PHP, aber ich habe Objekte anstelle von einfachen Arrays verwendet.


16
2017-07-16 01:37



Ich schrieb diese Variante unter Berücksichtigung der Wurzel parent_id ist 0 oder fehlt. Egal Kinder nach Eltern in DB ($ source) oder nicht.

$source_by_id = array();
foreach ($source as &$row){
  $source_by_id[$row['id']] = &$row;
}
foreach ($source_by_id as $id => &$row){
  $source_by_id[ intval($row['parent_id']) ]['children'][$id] = &$row;
}
// remove cycling itself
unset($source_by_id[0]['children'][0]);

$result = $source_by_id[0]['children'];

Ergebnis-Array-Schlüssel sind geeignete IDs. Genießen!


0
2017-11-29 08:23



Ich suchte nach einem Beispiel dafür, wie man das mit Kategorien macht. In diesem Beispiel wird davon ausgegangen, dass Eltern immer eine Eltern-ID von "0" haben. Das Beispiel verwendet ZF2.

Keine Referenzen oder Rekursion. Der Trick liegt in der Ausgabe, Sie suchen nach dem [0] -Index, und für die Kinder geben Sie die parent_id als den Index an.

$categoryLookup = $this->getCategoryLookup($associateById=true);

if ($assignedCategories) {          
    $categoryHeirarchy = array();
    foreach($assignedCategories as $assignedCategory) {
        $child = $categoryLookup[$assignedCategory->category_id];
        $parent = $categoryLookup[$child->parent_id];               
        $categoryHeirarchy[$child->parent_id][] = $categoryLookup[$child->category_id];
        $categoryHeirarchy[$parent->parent_id][$parent->category_id] = $categoryLookup[$parent->category_id];
    }           

    return $categoryHeirarchy;  
}


<h3>Categories</h3>
<dl class="dl-horizontal">
    <?php foreach($this->categoryHeirarchy[0] as $parent): ?>
        <dt><?php echo $this->escapeHtml($parent->name); ?></dt>
        <?php foreach($this->categoryHeirarchy[$parent->category_id] as $child): ?>
            <dd><?php echo $this->escapeHtml($child->name); ?></dd>
        <?php endforeach; ?>
    <?php endforeach; ?>                    
</dl>

0
2018-06-05 18:47