【问题标题】:How to generate a nested array structure from a resultset?如何从结果集中生成嵌套数组结构?
【发布时间】:2018-04-14 21:52:16
【问题描述】:

我有这个 Json 数组事件

[
    {
        "id": "4",
        "event_name": "Harliquins 7s",
        "event_description": "Ruggby game",
        "event_date": null,
        "event_venue": "UFA grounds",
        "event_company": "Harliquins",
        "event_image": "http://www.aal-europe.eu/wp-content/uploads/2013/12/events_medium.jpg",
        "event_ticket_no": "200",
        "paybill": "25666",
        "status": "0"
    },
    {
        "id": "5",
        "event_name": "christie &s",
        "event_description": "Ruggby",
        "event_date": "1-2-2917",
        "event_venue": "KISUMU ground",
        "event_company": "Kenya Games",
        "event_image": "N/A",
        "event_ticket_no": "400",
        "paybill": "79000",
        "status": "0"
    }
]

我也有这个选项

[
    {
        "id": "4",
        "event_id": "5",
        "options_id": "1",
        "seasonal": "1",
        "amount": "300"
    },
    {
        "id": "5",
        "event_id": "5",
        "options_id": "2",
        "seasonal": "1",
        "amount": "400"
    }
]

我想得到这个结果

[
    {
        "id": "4",
        "event_name": "Harliquins 7s",
        "event_description": "Ruggby game",
        "event_date": null,
        "event_venue": "UFA grounds",
        "event_company": "Harliquins",
        "event_image": "http://www.aal-europe.eu/wp-content/uploads/2013/12/events_medium.jpg",
        "event_ticket_no": "200",
        "paybill": "25666",
        "status": "0"
    },
    {
        "id": "5",
        "event_name": "christie &s",
        "event_description": "Ruggby",
        "event_date": "1-2-2917",
        "event_venue": "KISUMU ground",
        "event_company": "Kenya Games",
        "event_image": "N/A",
        "event_ticket_no": "400",
        "paybill": "79000",
        "status": "0",
        "Options:" [
            {
                 "id": "4",
                 "event_id": "5",
                 "options_id": "1",
                 "seasonal": "1",
                 "amount": "300"
             },
             {
                 "id": "5",
                 "event_id": "5",
                 "options_id": "2",
                 "seasonal": "1",
                 "amount": "400"
             }
         ]
    }
]

这是我的代码:

while( $row = $result->fetch_assoc()){
    $new_array[] =$row;
    $new_array['options'] =getTicketOptions($row['id']);
}
echo json_encode($new_array);

每个事件对象都有一个选项数组。

【问题讨论】:

  • 我担心您的 while 循环的效率。 getTicketOptions() 在做什么?是调用数据库查询吗?还是访问静态数组?或者是其他东西?如果这是进行迭代查询,那么单个 JOIN 查询可能是更好的方法。请澄清代码的这方面。

标签: php nested resultset


【解决方案1】:

我使用array_maparray_filter 函数得到了相同的结果,您可以在这里尝试我的代码:php sandbox,它总是在事件数组中创建选项属性:

$events = json_decode($events, true);
$options = json_decode($options, true);

$result = array_map( function ($item) use ($options) {

    $item['options'] = array_filter($options, function ($option) use ($item) {
       return $item['id'] == $option['event_id'];
    });

    return $item;

}, $events);

print_r($result);

【讨论】:

    【解决方案2】:

    我想你想在最后一个位置添加第二个数组??如果是,请按照答案。

    第一个数组

    [{"id":"4","event_name":"Harliquins 7s"},{"id":"5","event_name":"Harliquins 7s"}]
    

    第二个数组

    [{"id":"4","event_id":"5","options_id":"1"},{"id":"4","event_id":"5","options_id":"1"}]
    

    需要的数组

    [{"id":"4","event_name":"Harliquins 7s"},{"id":"5","event_name":"Harliquins 7s","options":[{"id":"4","event_id":"5","options_id":"1"},{"id":"4","event_id":"5","options_id":"1"}]}]
    

    PHP 代码

    $last_key = end(array_keys($data));
            foreach ($data as $key => $value) {
                if($key == $last_key){
                    $data[$key]['options'] = $data2;
                }
    
            }
    
            echo json_encode($data);
    

    【讨论】:

      【解决方案3】:

      在我看来,您只需要合并 2 个对象:

      $mergedObject = (object) array_merge((array) $events, (array) $options);
      

      【讨论】:

      • 您不应该从您找到的重复页面中复制答案。这会在 SO 上创建冗余信息。
      • 哦,好吧。那么这是否意味着我不应该费心回答?还是我应该把它作为评论?
      • 只需要标记/投票以关闭为重复项即可。这有助于 OP 找到正确的解决方案。减少浪费的志愿者时间(阅读问题并回答已回答的问题)。 OP 应该在询问之前进行搜索和研究——标记为重复表明没有进行详尽的研究(由于缺乏知识或懒惰)。这个主题是不同用户在 SO 上的争论点;如果您想对此事有更广泛的了解,我建议您搜索 Meta。你会看到更多的理由和一些反驳。
      【解决方案4】:

      你已经快到了。您需要做的就是一次分配 $row 和 Options:

      while( $row = $result->fetch_assoc()){
          $new_array[] = array($row, "Options" => getTicketOptions($row['id']));
      }
      echo json_encode($new_array);
      

      原因是$new_array[] 会自动设置一个新键而不知道它的值。因此,您以后不能轻易地将某些内容添加到此记录中。同时做这两件事可以为您解决问题。

      【讨论】:

        猜你喜欢
        • 2012-06-27
        • 1970-01-01
        • 2017-12-25
        • 2018-08-02
        • 1970-01-01
        • 2015-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多