Mysql
 sql >> Base de données >  >> RDS >> Mysql

Création de JSON imbriqué à l'aide de PHP MySQL

Pour regrouper efficacement les données de sous-tableau, vous devez implémenter des clés temporaires. cityId est une valeur appropriée pour regrouper par -- parce que cityNames peut intentionnellement dupliquer à l'avenir mais cityId ne doit jamais être dupliqué involontairement/intentionnellement dans votre table de base de données.

Quand chaque nouveau cityId est rencontré, le conditionnel isset() call déterminera si un nouvel ensemble complet de données doit être stocké, ou si les données doivent simplement être ajoutées au sous-tableau.

J'appelle array_slice() puisqu'il réduit la syntaxe inutile / le gonflement du code.

Après avoir parcouru toutes les lignes, vous pouvez réindexer le $result tableau, imbriquez-le dans runBasedOnCity , et ajoutez le status élément.

Je vais montrer ma démo avec PRETTY_PRINT afin qu'il soit plus facile à lire, mais dans votre code réel, vous devez supprimer le paramètre. Aussi, un conseil - essayez de garder vos noms de variables courts pour une meilleure lisibilité.

Code :(Démo )

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

Sortie :

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

Après avoir expliqué comment vous vouliez conserver l'id valeurs dans les sous-tableaux, voici cette solution :

Code :(Démo )

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