2017-06-22 85 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);