2017-09-26 3 views
0

Voici un tableau. Une fois qu'un nouvel élément arrive avec parent_uuid, je dois ajouter cela à la position correspondante, c'est-à-dire aux enfants de l'élément qui a la valeur comme valeur parent_uuid. Les enfants peuvent alors avoir d'autres enfants et si cela est spécifié, je dois l'insérer dans le parent particulier. Je pense que pour cela je dois chercher dans le tableau multidimensionnel avec la valeur parent_uuid. Comment puis-je faire cela et insérer en PHP?Recherche dans un tableau avec N niveau nesting = recherche récursive dans un tableau (sur les clés)

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

Si la concession est que « fondamentalement, c'est une structure d'arbre », il semble que la solution évidente est d'utiliser effectivement un arbre, avec tous les avantages de la recherche proposée par une véritable structure de données. –

+0

semble que c'est une question à répétition https://codereview.stackexchange.com/questions/44864/recursive-function-filtering-large-multidimensional-array-by-key-element-to-ht –

+0

@ Mike'Pomax 'Kamermans, mais comment faire cela en PHP? –

Répondre

1

c'est la structure dont vous avez besoin

$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'] = []; 

ce qui est de savoir si vous avez vraiment besoin « name » ou toute information complémentaire que vous devez stocker avec chaque élément. Si elle est à peu près une structure arborescente de uid, se débarrasser des clés « nom » et « enfants »

n'ont pas trouvé une fonction standard de php pour rechercher récursive pour une clé donnée (anyone?)

donc ici est la fonction dont vous avez besoin

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

Je pense que vous avez besoin d'une sorte de fonction récursive, voici mon exemple en désordre.

<?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

Merci beaucoup, Oleg. Cela fonctionne très bien avec les données que j'ai données. Mais s'il y en a un de plus, l'enfant intérieur est présent, cela n'ajoutera pas les enfants à cela. Pouvez-vous modifier s'il vous plaît comme il prend le niveau de profondeur 'N'? –

+0

Cela pourrait fonctionner: fonction arrayAddChild (& $ data, $ enfant) { foreach ($ data comme $ clé => valeur $) { if ($ value ['uuid'] === $ child ['parent_uuid' ]) { $ data [$ key] ['children'] [] = $ enfant; renvoyer true; } if (arrayAddChild ($ données [$ clé] ['enfants'], $ enfant)) { return true; } } return false; } –

+0

Le problème est que, si un objet a deux enfants et si j'essaie d'ajouter un autre enfant à un enfant, il montre "argument invalide suppiied pour foerach". Les modifications ci-dessus ne renvoie aucune erreur, mais il n'ajoute pas l'enfant. –