2017-06-22 31 views
0

我希望我的類別列表在返回給用戶時格式不錯。我從數據庫得到的是:PHP使用修改後的數據返回JSON

[ 
{ 
    "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 
},... 

我希望它保持樹形結構,如:

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

有沒有一種簡單的方法方式做到這一點還是我要循環訪問數據庫結果並創建新的組織數組以返回? 這樣做的最佳方法是什麼?問題是子類別也可能有子類別。或者,也許我應該保持從數據庫中獲得的結構,並將兒童ID添加爲數組(因爲我可以參考它們)?

我會很感激您的幫助。

謝謝。

+1

因爲你描述的關係是PHP內置的形式沒有數據類型或你必須創建的e你自己的樹形結構。只是因爲你必須描述構建它的算法。 – arkascha

+0

即時通訊使用流明(laravel)框架(新手在它)。它可以構建在類別模型中嗎? –

+0

我們可以在控制器中看到返回該代碼的代碼嗎? –

回答

0

解決方案:

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); 
} 

結果:

{"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

這一個不會工作,如果有例如貓或狗類別(並會有) –

+0

我不明白你的迴應,你能否讓我多一點?如果您指出它將與嵌套類別相同:貓和狗,作爲父類別,您應該細化尋找遞歸的解決方案。封裝到這個函數(array_walk_recursive):http://php.net/manual/en/function.array-walk-recursive.php –

+0

或者做傳統的遞歸回調傳遞:normalize_db_animals($ branch),其中$ branch可以是由當前迭代標記的子數組,並聲明一個$ normalized_tree數組,用於保持所需的數據。你應該在那裏評論json_encode()然後返回$ tree。謹防父母和孩子使用相同的名字和分類,或許你應該添加另一個屬性,如uuid。 –

0

試試這個

$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);