Konvertieren Sie ein flaches Array in ein mehrdimensionales

Lesezeit: 5 Minuten

Konvertieren Sie ein flaches Array in ein mehrdimensionales
Banker

Ich habe ein Array mit Baumdaten (nach übergeordneter ID). Ich möchte es in ein mehrdimensionales Array konvertieren. Wie erreicht man das am besten? Gibt es dafür eine Kurzfunktion?

Quellarray:

$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 Quellarray. Ich möchte, dass die Elemente mit fehlendem Elternteil root sind. Ergebnisarray:

$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: eckige Klammern entfernt.

  • Das erste ist bereits ein mehrdimensionales Array. Mehrdimensional bedeutet einfach Arrays innerhalb von Arrays.

    – Animation

    16. Juli 10 um 1:09 Uhr

  • äh, das ist kein gültiges PHP .. was tut [0] => Array(… bzw [‘Menu’] => array(… mean? Ich stecke also ziemlich fest und verstehe die Form Ihrer Eingabedaten nicht.

    – Scott Evernden

    16. Juli 10 um 1:14 Uhr


  • @animuson: Ja. Sie haben Recht. Ich war nicht präzise. aber ich denke es ist klar was ich will oder? @SpawnCxy: ja @Scott: das ist ein gültiges PHP. Array-Schlüssel können Zeichenfolgen sein, nicht nur Zahlen

    – Banker

    16. Juli 10 um 1:19 Uhr

  • Sie sind sich bewusst, dass Sie in CakePHP Ihr Modell als richtigen MPTT-Baum strukturieren, das Baumverhalten anhängen und einfach eine ausführen können $model->find('threaded') um dieses Ergebnis zu erhalten? book.cakephp.org/view/1339/Tree

    – verzeihen

    16. Juli 10 um 2:05 Uhr

  • @deceze: Ja, ich kenne ‘threaded’. Daran habe ich vorhin gedacht. Das Quellarray in meiner Frage ist das Ergebnis einiger Manipulationen mit dem Abfrageergebnis. Es ist nicht einfach, die Manipulationen mit ‘threaded’ Arrays durchzuführen. Es würde zu viele Abfragen erfordern, um eine einzige Abfrage für die von mir benötigten Ergebnisse durchzuführen. Also mache ich nur eine Abfrage, cache sie und filtere, was ich von dort brauche, und formatiere die Arrays danach.

    – Banker

    16. Juli 10 um 2:26 Uhr

Konvertieren Sie ein flaches Array in ein mehrdimensionales
Bill Karwin

Ich glaube nicht, dass es eine eingebaute Funktion in PHP gibt, die dies tut.

Ich habe den folgenden Code ausprobiert, und es scheint zu funktionieren, um das verschachtelte Array so vorzubereiten, wie Sie es beschreiben:

$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.

  • Du bist fantastisch! Vielen Dank für die funktionierende Lösung und die schnelle Antwort! Das Quellarray ist das Ergebnis der Datenbankabfrage.

    – Banker

    16. Juli 10 um 1:55 Uhr

  • Beachten Sie, dass dieser Algorithmus nur funktioniert, wenn Eltern in der db-Ergebnismenge erscheinen, bevor ihre Kinder erscheinen.

    – Bill Karwin

    16. Juli 10 um 2:05 Uhr

1644284166 705 Konvertieren Sie ein flaches Array in ein mehrdimensionales
vitalimak

Ich habe diese Variante geschrieben, da root parent_id 0 ist 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 entsprechende IDs. Genießen!

Ich suchte nach einem Beispiel dafür, wie man das mit Kategorien macht. Dieses Beispiel geht davon aus, dass Eltern immer eine Eltern-ID von ‘0’ haben. Das Beispiel verwendet ZF2.

Keine Referenzen oder Rekursion. Der Trick liegt in der Ausgabe, die Sie suchen [0] index, und für die Kinder geben Sie die parent_id als 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>

.

816760cookie-checkKonvertieren Sie ein flaches Array in ein mehrdimensionales

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy