sql >> Databáze >  >> RDS >> Mysql

Vytváření vnořených JSON pomocí PHP MySQL

Chcete-li efektivně seskupovat data podpole, měli byste implementovat dočasné klíče. cityId je vhodná hodnota pro seskupení podle -- protože cityNames může v budoucnu záměrně duplikovat, ale cityId nesmí se nikdy ne/úmyslně duplikovat ve vaší databázové tabulce.

Při každém novém cityId je zjištěno, podmíněné isset() volání určí, zda má být uložena nová/úplná sada dat, nebo zda mají být data pouze připojena k podpole.

Volám array_slice() protože omezuje zbytečnou syntaxi / nafouknutí kódu.

Po iteraci všech řádků můžete $result přeindexovat pole, vnořte jej do runBasedOnCity a přidejte status prvek.

Svou ukázku ukážu pomocí PRETTY_PRINT takže je snazší číst, ale ve vašem skutečném kódu byste měli parametr odstranit. Také malá rada – snažte se udržovat názvy proměnných stručné, aby byly lépe čitelné.

Kód:(Ukázka )

$resultset = [
    ["id" => "1", "cityId" => "1", "cityName" => "Bengaluru", "runId" => "2", "distance" => "10k", "status" => "1"],
    ["id" => "2", "cityId" => "1", "cityName" => "Bengaluru", "runId" => "1", "distance" => "5k", "status" => "1"],
    ["id" => "3", "cityId" => "1", "cityName" => "Bengaluru", "runId" => "5", "distance" => "3k", "status" => "0"],
    ["id" => "4", "cityId" => "2", "cityName" => "Chennai", "runId" => "1", "distance" => "5k", "status" => "1"],
    ["id" => "5", "cityId" => "2", "cityName" => "Chennai", "runId" => "2", "distance" => "10k", "status" => "1"],
    ["id" => "6", "cityId" => "2", "cityName" => "Chennai", "runId" => "4", "distance" => "15k", "status" => "1"]
];

foreach ($resultset as $row) {
    if (!isset($result[$row["cityId"]])) {
        $result[$row["cityId"]] = array("id" => $row["id"], "cityId" => $row["cityId"], $row["cityName"] => array(array_slice($row,-3)));
    } else {
        $result[$row['cityId']][$row["cityName"]][] = array_slice($row,-3);
    }
}

if (!isset($result)) {   // don't need to check rowCount() at all
    $result = 'Runs not found';
} else {
    $result = array_values($result);
}

$result = array("status" => true, "runsBasedOnCity" => $result);

var_export(json_encode($result, JSON_PRETTY_PRINT));

Výstup:

'{
    "status": true,
    "runsBasedOnCity": [
        {
            "id": "1",
            "cityId": "1",
            "Bengaluru": [
                {
                    "runId": "2",
                    "distance": "10k",
                    "status": "1"
                },
                {
                    "runId": "1",
                    "distance": "5k",
                    "status": "1"
                },
                {
                    "runId": "5",
                    "distance": "3k",
                    "status": "0"
                }
            ]
        },
        {
            "id": "4",
            "cityId": "2",
            "Chennai": [
                {
                    "runId": "1",
                    "distance": "5k",
                    "status": "1"
                },
                {
                    "runId": "2",
                    "distance": "10k",
                    "status": "1"
                },
                {
                    "runId": "4",
                    "distance": "15k",
                    "status": "1"
                }
            ]
        }
    ]
}'

Po vysvětlení, jak chcete zachovat id hodnoty v dílčích polích, zde je řešení:

Kód:(Ukázka )

foreach ($resultset as $row) {
    if (!isset($result[$row["cityId"]])) {
        $result[$row["cityId"]] = array("cityId" => $row["cityId"], $row["cityName"] => array(array("id" => $row["id"])+array_slice($row,-3)));
    } else {
        $result[$row['cityId']][$row["cityName"]][] = array("id" => $row["id"])+array_slice($row,-3);
    }
}

if (!isset($result)) {   // don't need to check rowCount() at all
    $result = 'Runs not found';
} else {
    $result = array_values($result);
}

$result = array("status" => true, "runsBasedOnCity" => $result);
var_export(json_encode($result, JSON_PRETTY_PRINT));



  1. Dotaz MySQL je po vytvoření indexu pomalejší

  2. Zábava s kompresí (columnstore) na velmi velkém stole – část 1

  3. Jaký návrhový vzor verzování byste doporučili

  4. Chyba MysQl:Neplatné číslo parametru