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