2017-06-22 3 views
0

Ich möchte meine Kategorien Liste nett formatiert sein, während Rückkehr zum Benutzer. Was ich aus der Datenbank erhalten ist:PHP JSON mit geänderten Daten zurückgeben

[ 
{ 
    "id": 1, 
    "name": "pet", 
    "parent_id": null 
}, 
{ 
    "id": 2, 
    "name": "page", 
    "parent_id": null 
}, 
{ 
    "id": 3, 
    "name": "dog", 
    "parent_id": 1 
}, 
{ 
    "id": 4, 
    "name": "cat", 
    "parent_id": 1 
}, 
{ 
    "id": 5, 
    "name": "rodent", 
    "parent_id": 1 
},... 

ich es will Baumstruktur halten, wie:

{ 
    "id": 1, 
    "name": "pet", 
    "parent_id": null, 
    "children": [ 
     { 
      "id": 3, 
      "name": "dog", 
      "parent_id": 1 
     }, 
     { 
      "id": 4, 
      "name": "cat", 
      "parent_id": 1 
     },... 

usw.

Gibt es eine einfache Art und Weise Art und Weise, es zu tun oder muss ich Schleife durch die Datenbankergebnisse und erstellen Sie ein neues organisiertes Array, das zurückgegeben werden soll? Was ist der beste Ansatz, um das zu tun? Das Problem ist, dass die Unterkategorien auch Unterkategorien haben können. Oder vielleicht sollte ich einfach die Struktur behalten, die ich von der Datenbank bekomme und Kinder-IDs als ein Array hinzufüge (wie ich sie auf jeden Fall bezeichnen kann)?

Ich wäre dankbar für Ihre Hilfe.

Vielen Dank.

+1

Da die Beziehung, die Sie beschreiben, nichts ist, der in PHP in Form gebaut Datentypen oder solche müssen Sie erstellen e die Baumstruktur selbst. Ganz einfach, weil Sie den Algorithmus beschreiben müssen, mit dem Sie ihn erstellen. – arkascha

+0

Ich benutze Lumen (Laravel) Framework (Neuling drin). Kann es in Kategorie-Modell gebaut werden? –

+0

Können wir den Code in Ihrem Controller sehen, der das zurückgibt? –

Antwort

0

Lösung:

function normalize_db_animals(){ 

    $values[] = ["id" => 1, "name" => "pet", "parent_id" => null]; 
    $values[] = ["id" => 2, "name" => "dog", "parent_id" => 1]; 
    $values[] = ["id" => 3, "name" => "cat", "parent_id" => 1]; 
    $values[] = ["id" => 4, "name" => "rodent", "parent_id" => 1]; 

    $values[] = ["id" => 5, "name" => "wild", "parent_id" => null]; 
    $values[] = ["id" => 6, "name" => "tiger", "parent_id" => 5]; 
    $values[] = ["id" => 7, "name" => "rhino", "parent_id" => 5]; 

    $normalize = function() use ($values) { 
     $tree = []; 
     $i = 0; 
     do { 
      $pet = $values[$i]; 
      if ($pet['parent_id']) { 
       if (array_key_exists($pet['parent_id'], $tree)) { 
        $tree[$pet['parent_id']]['children'][] = $pet; 
       } 
      } else { 
       $tree[$pet['id']] = $pet; 
      } 

      $i++; 
     } while ($i < count($values)); 

     return $tree; 
    }; 

    $tree = $normalize(); 
    echo json_encode($tree); 
} 

Ergebnis:

{"1":{"id":1,"name":"pet","parent_id":null,"children":[{"id":2,"name":"dog","parent_id":1},{"id":3,"name":"cat","parent_id":1},{"id":4,"name":"rodent","parent_id":1}]},"5":{"id":5,"name":"wild","parent_id":null,"children":[{"id":6,"name":"tiger","parent_id":5},{"id":7,"name":"rhino","parent_id":5}]}} 
+0

dieses wird nicht funktionieren, wenn es z.B. Katzen- oder Hundekategorien (und es wird geben) –

+0

Ich habe deine Antwort nicht verstanden, könntest du mich ein wenig mehr erleuchten? Wenn Sie angeben, dass es sich um geschachtelte Kategorien handeln soll, wie: cat und dog, die als übergeord- nete Kategorien fungieren, sollten Sie die Lösung nach Rekursion verfeinern. Encapsulate die Schließung in diese Funktion (array_walk_recursive): http://php.net/manual/en/function.array-walk-recursive.php –

+0

Oder machen traditionelle rekursive Callback-Übergabe: normalize_db_animals ($ Zweig), wo $ Zweig sein könnte Das Sub-Array wird durch die aktuelle Iteration markiert und deklariert ein $ normalized_tree-Array, das die gewünschten Daten weitergibt. Sie sollten json_encode() innerhalb von dann kommentieren und $ tree zurückgeben. Hüten Sie sich vor Eltern und Kindern mit dem gleichen Namen und der gleichen Klassifizierung, vielleicht sollten Sie eine weitere Eigenschaft als UUID hinzufügen. –

0

Versuchen Sie dieses

$a = json_decode('[{ 
     "id": 1, 
     "name": "pet", 
     "parent_id": null 
    }, 
    { 
     "id": 2, 
     "name": "page", 
     "parent_id": null 
    }, 
    { 
     "id": 3, 
     "name": "dog", 
     "parent_id": 1 
    }, 
    { 
     "id": 4, 
     "name": "cat", 
     "parent_id": 1 
    }, 
    { 
     "id": 5, 
     "name": "rodent", 
     "parent_id": 4 
    }, 
    { 
     "id": 6, 
     "name": "rodent", 
     "parent_id": 2 
    }]'); 

    $a = collect($a); 

    $filtered = $a; 

    foreach ($filtered as $key => $value) { 
     $children = $a->where('parent_id', $value->id); 
     if(!$children->isEmpty()){ 
     $value->children = $children; 
     $filtered->forget(array_values(array_keys($children->toArray()))); 

     } 

    } 
    dd($filtered);