Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Erstellen von verschachteltem JSON mit PHP MySQL

Um die Subarray-Daten effizient zu gruppieren, sollten Sie temporäre Schlüssel implementieren. cityId ist ein geeigneter Wert zum Gruppieren, weil cityNames kann in Zukunft absichtlich dupliziert werden, aber cityId darf niemals unbeabsichtigt in Ihrer Datenbanktabelle dupliziert werden.

Bei jeder neuen cityId angetroffen wird, die Bedingung isset() Der Aufruf bestimmt, ob ein neuer/vollständiger Datensatz gespeichert werden soll oder ob Daten lediglich an das Subarray angehängt werden sollen.

Ich rufe array_slice() auf da es unnötige Syntax-/Code-Aufblähungen reduziert.

Nachdem Sie alle Zeilen durchlaufen haben, können Sie das $result neu indizieren Array, verschachteln Sie es in runBasedOnCity , und fügen Sie den status hinzu Element.

Ich zeige meine Demo mit PRETTY_PRINT damit es einfacher zu lesen ist, aber in Ihrem eigentlichen Code sollten Sie den Parameter entfernen. Außerdem ein Ratschlag:Versuchen Sie, Ihre Variablennamen kurz zu halten, um die Lesbarkeit zu verbessern.

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

Ausgabe:

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

Nachdem Sie erklärt haben, wie Sie die id beibehalten möchten Werte in den Subarrays, hier ist die Lösung:

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