2017-09-26 1 views
0

Hier ist ein Array. Sobald ein neues Element mit parent_uuid kommt, muss ich das zu der entsprechenden Position hinzufügen, dh zu den Kindern des Elements, das uuid Wert als parent_uuid Wert hat. Die Kinder können dann andere Kinder haben, und wenn das angegeben ist, muss ich sie zu dem bestimmten Elternteil einfügen. Ich denke dafür muss ich zu dem mehrdimensionalen Array mit dem parent_uuid Wert suchen. Wie kann ich das machen und in PHP einfügen?Suche in einem Array mit N-Level Verschachtelung = rekursive Suche im Array (auf Schlüsseln)

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [uuid] => ef4b72ae-012a-4b2c-88b2-d4bf8726fcb9 
      [parent_uuid] => 
      [name] => First Parent 
      [children] => Array 
       (
       ) 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [uuid] => 74bd4b37-6a20-4579-99a3-ce56b0bc28a7 
      [parent_uuid] => 
      [name] => Second Parent 
      [children] => Array 
       (
        [0] => Array 
         (
          [id] => 3 
          [uuid] => f87c6d5c-93ec-40bf-a04d-c925dd1e0aca 
          [parent_uuid] => 74bd4b37-6a20-4579-99a3-ce56b0bc28a7 
          [name] => First Child 
          [children] => Array 
           (
           ) 

         ) 

        [1] => Array 
         (
          [id] => 4 
          [uuid] => cb2b3d9d-867c-40a0-9254-05b466859db1 
          [parent_uuid] => 74bd4b37-6a20-4579-99a3-ce56b0bc28a7 
          [name] => Second Child 
          [children] => Array 
           (
           ) 

         ) 

       ) 

     ) 

) 
+3

Wenn die Konzession ist, dass „im Grunde ist dies eine Baumstruktur“, es klingt wie die offensichtliche Lösung einen Baum tatsächlich zu verwenden ist, mit all dem Such profitiert von einer echten Datenstruktur angeboten. –

+0

scheint, als ob dies eine Wiederholungsfrage ist https://codereview.stackexchange.com/questions/44864/recursive-function-filtering-large-multidimensional-array-by-key-element-to-ht –

+0

@ Mike'Pomax "Kamermans, aber wie geht das in PHP? –

Antwort

1

das ist die Struktur, die Sie

$Array["ef4b72ae-012a-4b2c-88b2-d4bf8726fcb9"]['name'] = "First Parent"; 
$Array["ef4b72ae-012a-4b2c-88b2-d4bf8726fcb9"]['children'] = []; 

$Array["74bd4b37-6a20-4579-99a3-ce56b0bc28a7"]['name'] = "Second Parent"; 
$Array["74bd4b37-6a20-4579-99a3-ce56b0bc28a7"]['children']["f87c6d5c-93ec-40bf-a04d-c925dd1e0aca"]['name'] = "First Child"; 
$Array["74bd4b37-6a20-4579-99a3-ce56b0bc28a7"]['children']["f87c6d5c-93ec-40bf-a04d-c925dd1e0aca"]['children'] = []; 

$Array["74bd4b37-6a20-4579-99a3-ce56b0bc28a7"]['children']["cb2b3d9d-867c-40a0-9254-05b466859db1"]['name'] = "Second Child"; 
$Array["74bd4b37-6a20-4579-99a3-ce56b0bc28a7"]['children']["cb2b3d9d-867c-40a0-9254-05b466859db1"]['children'] = []; 

brauchen, und das ist, wenn Sie wirklich brauchen ‚name‘ oder eine ergänzende Informationen, die Sie mit jedem Element speichern müssen. Wenn es nur um eine Baumstruktur von uid ist, loszuwerden ‚name‘ und ‚Kinder‘ Schlüssel

hat keine Standard-PHP-Funktion rekursiv für einen bestimmten Schlüssel (anyone?) Suche gefunden

so hier Sie ist die Funktion

brauchen
function insertItem($newItem,$uidParent,$array) { 
    foreach ($array as $uid => $content) { 
     if ($uid == $uidParent) { // parent found, item insert 
      $array[$uid]['children'][$newItem['uid']]['name'] = $newItem['name']; 
      $array[$uid]['children'][$newItem['uid']]['children'] = []; 
     } elseif (!empty($content['children'])) { // recursively search the tree 
      $array[$uid]['children'] = insertItem($newItem,$uidParent,$content['children']); 
     } 
    } 
    return $array; 
} 

$newItem['name'] = "new item"; 
$newItem['uid'] = "f87c6d5c-93ec-40bf-a04d-c925dd1e0aca"; 
$uidParent = "cb2b3d9d-867c-40a0-9254-05b466859db1"; 
$Array = insertItem($newItem,$uidParent,$Array); 

sandbox here

1

ich denke, Sie irgendeine Art von rekursiven Funktion benötigen, hier meine unordentlichen Beispiel.

<?php 

header('Content-type: text/plain'); 

$data = array (
    0 => 
    array (
    'id' => 1, 
    'uuid' => 'ef4b72ae-012a-4b2c-88b2-d4bf8726fcb9', 
    'parent_uuid' => '', 
    'name' => 'First Parent', 
    'children' => 
    array (
    ), 
), 
    1 => 
    array (
    'id' => 2, 
    'uuid' => '74bd4b37-6a20-4579-99a3-ce56b0bc28a7', 
    'parent_uuid' => '', 
    'name' => 'Second Parent', 
    'children' => 
    array (
     0 => 
     array (
     'id' => 3, 
     'uuid' => 'f87c6d5c-93ec-40bf-a04d-c925dd1e0aca', 
     'parent_uuid' => '74bd4b37-6a20-4579-99a3-ce56b0bc28a7', 
     'name' => 'First Child', 
     'children' => 
     array (
     ), 
    ), 
     1 => 
     array (
     'id' => 4, 
     'uuid' => 'cb2b3d9d-867c-40a0-9254-05b466859db1', 
     'parent_uuid' => '74bd4b37-6a20-4579-99a3-ce56b0bc28a7', 
     'name' => 'Second Child', 
     'children' => 
     array (
     ), 
    ), 
    ), 
), 
); 

function arrayAddChild(&$data, $child) { 
    if (!isset($data) || !is_array($data) || empty($data)) { 
     return false; 
    } 
    foreach ($data as $key => $value) { 
     if ($value['uuid'] === $child['parent_uuid']) { 
      $data[$key]['children'][] = $child; 
      return true; 
     } 
     if(arrayAddChild($data[$key]['children'], $child)) { 
      return true; 
     } 
    } 
    return false; 
} 

var_export(arrayAddChild($data, [ 
         'id' => 31, 
         'uuid' => '31', 
         'parent_uuid' => 'cb2b3d9d-867c-40a0-9254-05b466859db1', 
         'name' => 'Second Child', 
         'children' => [] 
         ] 
        )); 

var_export(arrayAddChild($data, [ 
         'id' => 32, 
         'uuid' => '32', 
         'parent_uuid' => '31', 
         'name' => 'Second Child', 
         'children' => [] 
         ] 
        )); 

var_export(arrayAddChild($data, [ 
         'id' => 33, 
         'uuid' => '33', 
         'parent_uuid' => '32', 
         'name' => 'Second Child', 
         'children' => [] 
         ] 
        )); 
var_export(arrayAddChild($data, [ 
         'id' => 34, 
         'uuid' => '34', 
         'parent_uuid' => '33', 
         'name' => 'Second Child', 
         'children' => [] 
         ] 
        )); 
var_export(arrayAddChild($data, [ 
         'id' => 35, 
         'uuid' => '35', 
         'parent_uuid' => '34', 
         'name' => 'Second Child', 
         'children' => [] 
         ] 
        )); 
var_export(arrayAddChild($data, [ 
         'id' => 36, 
         'uuid' => '36', 
         'parent_uuid' => '35', 
         'name' => 'Second Child', 
         'children' => [] 
         ] 
        )); 


var_export($data); 
+0

Vielen Dank, Oleg. Dies funktioniert gut mit den Daten, die ich angegeben habe. Aber wenn es noch ein inneres Kind gibt, wird es die Kinder nicht dazu hinzufügen. Können Sie bitte modifizieren, da es 'N' Tiefe erfordert? –

+0

Das könnte funktionieren: Funktion ArrayAddChild (& $ Daten, $ Kind) { foreach ($ Daten als $ Schlüssel => $ Wert) { If ($ Wert ['Uuid'] === $ Kind ['Eltern_Uuid' ]) { $ data [$ key] ['children'] [] = $ kind; Rückkehr wahr; } if (arrayAddChild ($ data [$ key] ['Kinder'], $ Kind))) { zurück True; } } Rückgabe false; } –

+0

Das Problem ist, wenn ein Element zwei Kinder hat und wenn ich versuche, ein weiteres Kind zu einem der Kind hinzufügen, zeigt es "Ungültiges Argument für förach geliefert". Die obigen Änderungen geben keinen Fehler zurück, aber das Kind wird nicht hinzugefügt. –