sql >> Database >  >> RDS >> Mysql

Geneste JSON maken met PHP MySQL

Om de subarraygegevens efficiënt te groeperen, moet u tijdelijke sleutels implementeren. cityId is een geschikte waarde om op te groeperen -- omdat cityNames kan in de toekomst opzettelijk dupliceren, maar cityId mag nooit onbedoeld dupliceren in uw databasetabel.

Wanneer elke nieuwe cityId wordt aangetroffen, de voorwaardelijke isset() call bepaalt of een nieuwe/volledige set gegevens moet worden opgeslagen, of dat gegevens alleen aan de subarray moeten worden toegevoegd.

Ik bel array_slice() omdat het onnodige syntaxis / code-bloat vermindert.

Nadat u alle rijen hebt doorlopen, kunt u de $result . opnieuw indexeren array, nest het in runBasedOnCity en voeg de status . toe element.

Ik laat mijn demo zien met PRETTY_PRINT zodat het gemakkelijker te lezen is, maar in uw eigenlijke code moet u de parameter verwijderen. Ook een advies -- probeer de namen van uw variabelen kort te houden voor een betere leesbaarheid.

Code:(Demo )

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

Uitgang:

'{
    "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"
                }
            ]
        }
    ]
}'

Nadat je hebt uitgelegd hoe je de id . wilde behouden waarden in de subarrays, hier is die oplossing:

Code:(Demo )

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. Verwijder MySQL-rij na 30 minuten met behulp van Cron Jobs/Event Scheduler

  2. Hoe Access 2019 werkt en hoe u ermee werkt

  3. Hoe JDBC te gebruiken om MySql-database te verbinden?

  4. FOUT 1005 MySQL Workbench Forward engineering