【问题标题】:php nested array for json output用于json输出的php嵌套数组
【发布时间】:2016-05-18 18:50:36
【问题描述】:

我对 3 个表运行查询,并尝试将结果格式化为嵌套数组。这是让我难倒的内部数组。大小数组应该在啤酒数组对象中,但在它之外。任何帮助表示赞赏。

JSON

    {
    "brewerId": "41", 
    "brewerName": "Prancing Pony Brewing", 
    "beers": [
        {
            "beerid": "816", 
            "productName": "Prancing Pony Amber Ale", 
            "ibu": "18.00", 
            "abv": "5.00", 
            "style": "Amber Ale"
        }, 
        {
            "beerid": "817", 
            "productName": "Prancing Pony Copper Ale", 
            "ibu": "25.00", 
            "abv": "5.80", 
            "style": "Indian Pale Ale"
        }, 
        {
            "beerid": "837", 
            "productName": "Prancing Pony Pale Ale", 
            "ibu": "37.00", 
            "abv": "5.50",  
            "style": "Pale Ale"
        }, 
        {
            "beerid": "838", 
            "productName": "Prancing Pony India Red Ale", 
            "ibu": "60.00", 
            "abv": "7.90", 
            "style": "Indian Pale Ale"
        }
    ], 
    "sizes": [
        {
            "beerId": "816", 
            "size": "330ml Bottle"
        }, 
        {
            "beerId": "816", 
            "size": "330ml Can"
        }, 
        {
            "beerId": "837", 
            "size": "345ml Can"
        }, 
        {
            "beerId": "837", 
            "size": "375ml Bottle"
        }
    ]
}, 

PHP

    $result = $func->getBrewers(); 
    $json_response = array(); 
    while ($row = mysqli_fetch_array($result))
    {
        $row_array = array();
        $row_array['brewerId'] = $row['brewerId'];        
        $row_array['brewerName'] = $row['brewerName'];
        $row_array['beers'] = array();
        $brewer_pk = $row['brewerId'];  

        $beer_qry = $func->getBeers($brewer_pk);
        while ($beer_fet = mysqli_fetch_array($beer_qry))
        {
            $row_array['beers'][] = array(
            'beerid' => $beer_fet['beerid'],
            'productName' => $beer_fet['productName'],
            'ibu' => $beer_fet['ibu'],
            'abv' => $beer_fet['abv'],
            'notes' => $beer_fet['notes'],
            'style' => $beer_fet['style'],

        );

        $beer_pk = $beer_fet['beerid'];
        $size_qry = $func->getSizes($beer_pk);
        while ($size_fet = mysqli_fetch_array($size_qry))
        {
            $row_array['sizes'][] = array(
            'beerId' => $size_fet['beerId'],
            'size' => $size_fet['size'],
            );
        }
    }

    array_push($json_response, $row_array);
    }
    echo json_encode($json_response);

【问题讨论】:

  • 这种方法的性能和可扩展性很糟糕。在解析返回的行时运行单个连接查询并构建嵌套。

标签: php arrays json


【解决方案1】:

您似乎在某个时候误会了,从那时起就出错了。

$result = $func->getBrewers(); 
$json_response = array(); 
while ($row = mysqli_fetch_array($result))
{
    $row_array = array(
        'brewerId'   => $row['brewerId'],
        'brewerName' => $row['brewerName'],
        'beers'      => array()
    );

    $brewer_pk = $row['brewerId'];  
    $beer_qry = $func->getBeers($brewer_pk);
    while ($beer_fet = mysqli_fetch_array($beer_qry))
    {
        $tmp = array(
            'beerid'      => $beer_fet['beerid'],
            'productName' => $beer_fet['productName'],
            'ibu'         => $beer_fet['ibu'],
            'abc'         => $beer_fet['abv'],
            'notes'       => $beer_fet['notes'],
            'style'       => $beer_fet['style'],
            'sizes'       => array()
        );

        $beer_pk = $tmp['beerid'];
        $size_qry = $func->getSizes($beer_pk);
        while ($size_fet = mysqli_fetch_array($size_qry))
        {
            $tmp['sizes'][] = array(
                'beerId' => $size_fet['beerId'],
                'size'   => $size_fet['size'],
            );
        }

        $row_array['beers'][] => $tmp;
    }

    array_push($json_response, $row_array);
}

echo json_encode($json_response);

为了稍微简化引用,我重写了要在 $tmp 变量中创建的啤酒,该变量现在还有一个 'sizes' 数组,各种大小将附加到该数组中。 添加啤酒和大小后,$tmp 将添加到啤酒中。

请注意,您现在将执行更多数据库查询,因为它现在(按要求)获取每瓶啤酒的尺寸,而不仅仅是最后一瓶。

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多