Creating nested JSON using PHP MySQL - php

I have an SQL Query returning certain fields, I am using json_encode() to get the data in JSON format, however I am having trouble getting it in the format I want.
PHP Code
<?php
function data() {
$runDistanceBasedOnCityQuery = "SELECT rc.id, rc.cityId, c.cityName, rc.runId, r.distance, rc.status FROM run_city rc INNER JOIN cities c ON c.id = rc.cityId INNER JOIN run_distance r ON r.id = rc.runId ORDER BY c.cityName";
$runDistanceBasedOnCityResult = $db->prepare($runDistanceBasedOnCityQuery);
$runDistanceBasedOnCityResult->bindParam(":cityId", $cityId, PDO::PARAM_INT);
$runDistanceBasedOnCityResult->execute();
$runDistanceBasedOnCityOutput = $runDistanceBasedOnCityResult->rowCount();
if ($runDistanceBasedOnCityOutput > 0) {
while ($runDistanceBasedOnCityRow = $runDistanceBasedOnCityResult->fetch(PDO::FETCH_ASSOC)) {
$array1 = array($runDistanceBasedOnCityRow['runId'], $runDistanceBasedOnCityRow['distance'], $runDistanceBasedOnCityRow['status']);
for ($i = 0; $i < sizeof($array1); $i++) {
$array2 = array("id" => $runDistanceBasedOnCityRow['id'], "runId" => $runDistanceBasedOnCityRow['cityId'], $runDistanceBasedOnCityRow['cityName'] => $array1);
}
$finalResultRunDistanceBasedOnCity[] = $array2;
}
$responseRunDistanceBasedOnCity = $finalResultRunDistanceBasedOnCity;
} else {
$responseRunDistanceBasedOnCity = 'Runs not found';
}
$result = array("status" => true,
"runsBasedOnCity" => $responseRunDistanceBasedOnCity
);
json($result);
}
function json($data) {
header('Content-Type:application/json');
if (is_array($data)) {
echo json_encode($data);
}
}
?>
The JSON format I am getting
"runsBasedOnCity": [
{
"id": "1",
"runId": "1",
"Bengaluru": [
"2",
"10k",
"1"
]
},
{
"id": "2",
"runId": "1",
"Bengaluru": [
"1",
"5k",
"1"
]
},
{
"id": "3",
"runId": "1",
"Bengaluru": [
"5",
"3k",
"0"
]
},
{
"id": "4",
"runId": "2",
"Chennai": [
"1",
"5k",
"1"
]
},
{
"id": "5",
"runId": "2",
"Chennai": [
"2",
"10k",
"1"
]
},
{
"id": "6",
"runId": "2",
"Chennai": [
"4",
"15k",
"1"
]
}
]
The Format I Require
"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": "2",
"cityId": "2",
"Chennai":
[
{
runId : "1",
distance : "5k",
status : "1"
},
{
runId : "2",
distance: "10k",
status : "1"
},
{
runId : "4",
distance : "15k",
status : "1"
}
]
}
I am not able to figure out a better way of doing this, I am fairly new to this, do help me out. Thanks !

To efficiently group the subarray data, you should implement temporary keys. cityId is a suitable value to group by -- because cityNames may intentionally duplicate in the future but cityId must never un/intentionally duplicate in your database table.
When each new cityId is encountered, the conditional isset() call will determine whether a new/full set of data should be stored, or if data should merely be appended to the subarray.
I am calling array_slice() since it cuts down on unnecessary syntax / code-bloat.
After iterating through all of the rows, you can reindex the $result array, nest it inside runBasedOnCity, and add the status element.
I'll show my demo with PRETTY_PRINT so that it is easier to read, but in your actual code, you should remove the parameter. Also, a word of advice -- try to keep your variable names brief for improved readability.
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));
Output:
'{
"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"
}
]
}
]
}'
After explaining how you wanted to preserve the id values in the subarrays, here is that solution:
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));

Related

Insert value in array after every index using php

I have fetch value from database and returning its array in json format. This is my code to get values. First array is working fine. But i need to add static array after every index in array. This is my code
$value = $this->TestModel->get_user_details($userIds);
this function returns array in json format e.g.
[
{
"user_id": "1",
"name": "test 1",
},
{
"user_id": "2",
"name": "test 2",
},
{
"user_id": "3",
"name": "test 3",
},
]
now i need to add below static json array with every item of array. This is e.g
$test1= array("student_list"=> array(array("stu_id"=>1, "name"=> "abc") , array("stu_id"=>2, "name"=> "xyz")),
"class"=> "12th",
"average_score"=>"5",
"results"=>array(array("result_date"=>"2012-12-13","city"=>"city 1"),array("result_date"=>"2015-10-13","city"=>"city 2")));
I have tried it with array_push and array_merge but it add this at the end end of array.
I need this Response
[
{
"user_id": "1",
"name": "test 1",
"student_list": [
{
"stu_id": 1,
"name": "abc",
},
{
"stu_id": 2,
"name": "xyz",
}
],
"class": "12th",
"average_score": "5",
"results": [
{
"result_date": "2012-12-13",
"city": "City 1",
},
{
"result_date": "2012-10-13",
"city": "City 2",
}
]
},
{
"user_id": "2",
"name": "test 2",
"student_list": [
{
"stu_id": 3,
"name": "asd",
},
{
"stu_id": 4,
"name": "ghj",
}
],
"class": "10th",
"average_score": "5",
"results": [
{
"result_date": "2011-12-13",
"city": "City 3",
},
{
"result_date": "2011-10-13",
"city": "City 4",
}
]
},
]
If you want to add $test1 to to every element you your array you should merge each element, like so:
$value = $this->TestModel->get_user_details($userIds);
$test1 = array(
"student_list" => array(array("stu_id" => 1, "name" => "abc"), array("stu_id" => 2, "name" => "xyz")),
"class" => "12th",
"average_score" => "5",
"results" => array(array("result_date" => "2012-12-13", "city" => "city 1"), array("result_date" => "2015-10-13", "city" => "city 2"))
);
$decoded = json_decode($value, true);
for ($i = 0; $i < count($decoded); $i++) {
$decoded[$i] = array_merge($decoded[$i], $test1);
}
$value = json_encode($decoded);

how to remove specific key from multidimension array

This is what the result i need to come out with
"data": [
{
"ticket_category_id": "677",
"ticket_category_name": " Testing 500",
"ticket_category_order": "1",
"tickets":
[
{
"ticket_id": "927",
"ticket_title": "EDI Project Template with attachments",
"ticket_order": "1",
"due_date": "0000-00-00 00:00:00",
"created_date": "2018-05-16 10:01:04",
"edited_date": "2018-05-17 02:56:38",
"updated_date": "2018-05-17 02:56:38",
"is_complete": "0",
"total_comment": "0",
"total_attachment": "10",
"total_checklist_items": "48",
"total_completed_checklist_items": "0",
"label": [
{
"ticket_label_name": "",
"ticket_color_code": "#FF3B30"
},
"#D4891C": {
"ticket_label_name": "IN PROGRESS",
"ticket_color_code": "#D4891C"
}]
},
"people": []
},
{
"ticket_id": "928",
"ticket_title": "EDI Project Template",
"ticket_order": "2",
"due_date": "0000-00-00 00:00:00",
"created_date": "2018-05-16 10:01:04",
"edited_date": "0000-00-00 00:00:00",
"updated_date": "0000-00-00 00:00:00",
"is_complete": "0",
"total_comment": "0",
"total_attachment": "0",
"total_checklist_items": "48",
"total_completed_checklist_items": "0",
"label": [
{
"ticket_label_name": "",
"ticket_color_code": "#4CD964"
}]
},
"people": []
}
]
But what i get the result is like below
{
"data": [
{
"ticket_category_id": "677",
"ticket_category_name": " Testing 500",
"ticket_category_order": "1",
"tickets": {
"927": {
"ticket_id": "927",
"ticket_title": "EDI Project Template with attachments",
"ticket_order": "1",
"due_date": "0000-00-00 00:00:00",
"created_date": "2018-05-16 10:01:04",
"edited_date": "2018-05-17 02:56:38",
"updated_date": "2018-05-17 02:56:38",
"is_complete": "0",
"total_comment": "0",
"total_attachment": "10",
"total_checklist_items": "48",
"total_completed_checklist_items": "0",
"label": {
"#FF3B30": {
"ticket_label_name": "",
"ticket_color_code": "#FF3B30"
}
},
"people": []
}
}
},
{
"ticket_category_id": "677",
"ticket_category_name": " Testing 500",
"ticket_category_order": "1",
"tickets": {
"927": {
"ticket_id": "927",
"ticket_title": "EDI Project Template with attachments",
"ticket_order": "1",
"due_date": "0000-00-00 00:00:00",
"created_date": "2018-05-16 10:01:04",
"edited_date": "2018-05-17 02:56:38",
"updated_date": "2018-05-17 02:56:38",
"is_complete": "0",
"total_comment": "0",
"total_attachment": "10",
"total_checklist_items": "48",
"total_completed_checklist_items": "0",
"label": {
"#D4891C": {
"ticket_label_name": "IN PROGRESS",
"ticket_color_code": "#D4891C"
}
},
"people": []
}
}
},
And below is the code I have done, I using php mysql one to many relationship get all the data to be flat array, and then below code is convert single flat array into three multidimension array, but i meet a bottleneck. Please help to review my code to point out which part I need to change to become my expected result.
$result = array();
foreach($total_count as $Key => $Value){
$ticketCatId = $Value['ticket_category_id'];
$ticketId = $Value['ticket_id'];
$ticketColorCode = $Value['ticket_color_code'];
$ticketMember = $Value['user_id'];
$result[$ticketCatId]['ticket_category_id'] = $Value['ticket_category_id'];
$result[$ticketCatId]['ticket_category_name'] = $Value['ticket_category_name'];
$result[$ticketCatId]['ticket_category_order'] = $Value['ticket_category_order'];
if(!isset($result[$ticketCatId]['tickets'])) {
$result[$ticketCatId]['tickets'] = array();
}
// this code is append the ticket ID
if($ticketId && !isset($result[$ticketCatId]['tickets'][$ticketId])) {
$ticket = array(
'ticket_id' => $Value['ticket_id'],
'ticket_title' => $Value['ticket_title'],
'ticket_order' => $Value['ticket_order'],
'due_date' => $Value['due_date'],
'created_date' => $Value['created_date'],
'edited_date' => $Value['edited_date'],
'updated_date' => $Value['updated_date'],
'is_complete' => $Value['is_complete'],
'total_comment' => $Value['total_comment'],
'total_attachment' => $Value['total_attachment'],
'total_checklist_items' => $Value['total_checklist_items'],
'total_completed_checklist_items' => $Value['total_completed_checklist_items'],
'label' => array(),
'people' => array()
);
$result[$ticketCatId]['tickets'][$ticketId] = $ticket;
}
if($ticketColorCode && isset($result[$ticketCatId]['tickets'][$ticketId]) && !isset($result[$ticketCatId]['tickets'][$ticketId]['label'][$ticketColorCode])) {
$ticketColor = array(
'ticket_label_name' => $Value['ticket_label_name'],
'ticket_color_code' => $Value['ticket_color_code']
);
$result[$ticketCatId]['tickets'][$ticketId]['label'][$ticketColorCode] = $ticketColor;
}
if($ticketMember && isset($result[$ticketCatId]['tickets'][$ticketId]) && !isset($result[$ticketCatId]['tickets'][$ticketId]['people'][$ticketMember])) {
$ticketPeople = array(
'user_id' => $Value['user_id'],
'photo' => $Value['photo']
);
$result[$ticketCatId]['tickets'][$ticketId]['people'][$ticketMember] = $ticketPeople;
}
}
dd(json_encode(["data"=>$result]));
I don't have any sample data to work with, so I can't actually test this for you. The general idea though is that each time through the loop, you initialize a temporary array ($tmpArray = array();) and put all the loop-specific values into that array. Then, at the end of each loop iteration, you push that temporary array onto your $results array ($result[] = $tmpArray;), allowing PHP to automatically create sequential indexes for $results. The reason why you are getting nested JSON objects currently is because json_encode() will only produce JSON arrays from sequentially-index PHP arrays
$result = array();
foreach($total_count as $Key => $Value){
$ticketCatId = $Value['ticket_category_id'];
$ticketId = $Value['ticket_id'];
$ticketColorCode = $Value['ticket_color_code'];
$ticketMember = $Value['user_id'];
$tmpArray = array();
$tmpArray['ticket_category_id'] = $Value['ticket_category_id'];
$tmpArray['ticket_category_name'] = $Value['ticket_category_name'];
$tmpArray['ticket_category_order'] = $Value['ticket_category_order'];
if(!isset($tmpArray['tickets'])) {
$tmpArray['tickets'] = array();
}
// this code is append the ticket ID
if($ticketId && !isset($tmpArray['tickets'][$ticketId])) {
$ticket = array(
'ticket_id' => $Value['ticket_id'],
'ticket_title' => $Value['ticket_title'],
'ticket_order' => $Value['ticket_order'],
'due_date' => $Value['due_date'],
'created_date' => $Value['created_date'],
'edited_date' => $Value['edited_date'],
'updated_date' => $Value['updated_date'],
'is_complete' => $Value['is_complete'],
'total_comment' => $Value['total_comment'],
'total_attachment' => $Value['total_attachment'],
'total_checklist_items' => $Value['total_checklist_items'],
'total_completed_checklist_items' => $Value['total_completed_checklist_items'],
'label' => array(),
'people' => array()
);
$tmpArray['tickets'][$ticketId] = $ticket;
}
if($ticketColorCode && isset($tmpArray['tickets'][$ticketId]) && !isset($tmpArray['tickets'][$ticketId]['label'][$ticketColorCode])) {
$ticketColor = array(
'ticket_label_name' => $Value['ticket_label_name'],
'ticket_color_code' => $Value['ticket_color_code']
);
$tmpArray['tickets'][$ticketId]['label'][$ticketColorCode] = $ticketColor;
}
if($ticketMember && isset($tmpArray['tickets'][$ticketId]) && !isset($tmpArray['tickets'][$ticketId]['people'][$ticketMember])) {
$ticketPeople = array(
'user_id' => $Value['user_id'],
'photo' => $Value['photo']
);
$tmpArray['tickets'][$ticketId]['people'][$ticketMember] = $ticketPeople;
}
$result[] = $tmpArray;
}
dd(json_encode(["data"=>$result]));

Replace null with empty string value in multidimensional array php

I have one multidimensional array with null key value. How to replace null to empty string in multidimensional array php ? my array is
"result": [
{
"id": "1",
"first_name": "Kishan",
"last_name": "Patel",
"profile_picture": null,
"email": "imkishanpatel107#gmail.com",
"birthdate": "1992-07-10",
"gender": "male",
"nickname": "KK",
"town": null,
"state": "58",
"bio": "123",
"zipcode": "395006",
"radius": "12356",
"favroiteteam": "2",
"latitude": "1.25456",
"longitude": "4.5658787",
"message_enable": "0",
"ratting_enable": "0",
"add_friend_enable": "0",
"interested_in": null,
"user_sport": [
{
"sport": {
"id": "3",
"name": "Basketball",
"image": "",
"no_of_player": "9",
"is_active": "1"
},
"sportPosition": {
"id": "1",
"sport_id": "3",
"position_name": "Point Guard"
},
"skill_level": {
"id": "1",
"name": "Novice"
}
},
{
"sport": {
"id": "2",
"name": "Baseball",
"image": "",
"no_of_player": "10",
"is_active": "1"
},
"sportPosition": {
"id": "6",
"sport_id": "2",
"position_name": "Pitcher"
},
"skill_level": {
"id": "3",
"name": "Advanced"
}
},
{
"sport": {
"id": "8",
"name": "Roller Hockey",
"image": "",
"no_of_player": "0",
"is_active": "1"
},
"sportPosition": {
"id": "15",
"sport_id": "8",
"position_name": "Forward"
},
"skill_level": {
"id": "1",
"name": "Novice"
}
}
]
}
]
Simply put a loop and check if null with foreach
foreach ($array as $key => $value) {
if (is_null($value)) $array[$key] = "";
}
#Kishan Kikani you can not replace null to '' because both consider as empty value that in the output of your array there will be empty value at the place of null or '' you have to assign something to replace your value in above array like below you have both ways(your and mine) you can do:
<?php
$result = array("result"=>
array(
"id"=> "1",
"first_name"=> "Kishan",
"last_name"=> "Patel",
"profile_picture"=> null,
"email"=> "imkishanpatel107#gmail.com",
"birthdate"=> "1992-07-10",
"gender"=> "male",
"nickname"=> "KK",
"town"=> null,
"state"=> "58",
"bio"=> "123",
"zipcode"=> "395006",
"radius"=> "12356",
"favroiteteam"=> "2",
"latitude"=> "1.25456",
"longitude"=> "4.5658787",
"message_enable"=> "0",
"ratting_enable"=> "0",
"add_friend_enable"=> "0",
"interested_in"=> null,
"user_sport"=>
array(
"sport"=> array(
"id"=> "3",
"name"=> "Basketball",
"image"=> "",
"no_of_player"=> "9",
"is_active"=> "1"
),
"sportPosition"=> array(
"id"=> "1",
"sport_id"=> "3",
"position_name"=> "Point Guard"
),
"skill_level"=> array(
"id"=> "1",
"name"=> "Novice"
)
),
array(
"sport"=> array(
"id"=> "2",
"name"=> "Baseball",
"image"=> "",
"no_of_player"=> "10",
"is_active"=> "1"
),
"sportPosition"=> array(
"id"=> "6",
"sport_id"=> "2",
"position_name"=> "Pitcher"
),
"skill_level"=> array(
"id"=> "3",
"name"=> "Advanced"
)
),
array(
"sport"=> array(
"id"=> "8",
"name"=> "Roller Hockey",
"image"=> "",
"no_of_player"=> "0",
"is_active"=> "1"
),
"sportPosition"=> array(
"id"=> "15",
"sport_id"=> "8",
"position_name"=> "Forward"
),
"skill_level"=> array(
"id"=> "1",
"name"=> "Novice"
)
)
)
);
echo "<pre>";
print_r($result); // BEFORE
foreach($result as $rsKey => $rs){
foreach($rs as $key => $value){
if(is_null($value)){
$result[$rsKey][$key] = "";
}
}
}
echo "<pre>";
print_r($result); // after replace only null to "" but there will be a empty space in the values
foreach($result as $rsKey => $rs){
foreach($rs as $key => $value){
if(is_array($value)){
foreach ($value as $k => $v) {
foreach ($v as $k1 => $v1) {
if(empty($v1)){
$result[$rsKey][$key][$k][$k1] = "level2";
}
}
}
}
else{
if(is_null($value)){
$result[$rsKey][$key] = "level1";
}
}
}
}
echo "<pre>";
print_r($result); // after replace whole array empty values
try any one you want (y)
$arr = array(
"key1"=>"value1",
"key2"=>null,
"key3"=>array(
"subkey1"=>null,
"subkey2"=>"subvalue2"),
"key4"=>null);
echo json_encode(replace_null_with_empty_string($arr));
function replace_null_with_empty_string($array)
{
foreach ($array as $key => $value)
{
if(is_array($value))
$array[$key] = replace_null_with_empty_string($value);
else
{
if (is_null($value))
$array[$key] = "";
}
}
return $array;
}
Piggybacking off #Atish's answer... I cleaned it up and made it simpler. This loops through the array and alters the value reference (&), then loops thru each next dimension of the array using recursion. #Daidon's answer only loops thru the first dimension.
The new function looks like this...
function null2empty($array){
foreach ($array as &$value) {
$value = (is_array($value)) ? null2empty($value) : $value;
$value = (is_null($value)) ? "" : $value;
}
return $array;
}
to use it, you would call it like this...
$profile_array = null2empty($profile_array);

Creating array inside array from mysql data to json

I am trying to create json with php from two mysql tables:- Category(unique)- Subcategories or Rights(multiple in same category)But I can't list multiple subcategories under one category. Instead, for every subcategory new set of results is made that contains category data also.
This is php code:
$sql = "SELECT a.id as rid,a.name as rname,a.img as rimg,a.price,b.id as cid,b.name as cname FROM rights a INNER JOIN categories b ON a.category=b.id";
$result = $mysqli->query($sql);
if ($result->num_rows > 0) {
$json_response = array();
while($row = $result->fetch_assoc()) {
$row_array['idCategory'] = $row['cid'];
$row_array['nameCategory'] = $row['cname'];
$row_array['rights'] = array([
'idRight' => $row['rid'],
'name' => $row['rname'],
'price' => $row['price'],
'image' => $row['rimg']
]);
array_push($json_response,$row_array);
}
echo json_encode($json_response);
}
With this I am getting:
[{
"idCategory": "1",
"nameCategory": "Cat1",
"rights": [{
"idRight": "1",
"name": "Right1 in Cat1",
"price": "10",
"image": "img1.jpg"
}]
}, {
"idCategory": "2",
"nameCategory": "Cat2",
"rights": [{
"idRight": "2",
"name": "Right1 in Cat2",
"price": "20",
"image": "img2.jpg"
}]
}, {
"idCategory": "2",
"nameCategory": "Cat2",
"rights": [{
"idRight": "3",
"name": "Right2 in Cat2",
"price": "30",
"image": "img3.jpg"
}]
}]
I tried changing mysql select with GROUP_CONCAT and GROUP BY but then I get data in one row like this:
"rights": [{
"idRight": "2,3",
"name": "Right1 in Cat2,Right2 in Cat2",
"price": "20,30",
"image": "img2.jpg,img3.jpg"
}]
But I need it like this:
[{
"idCategory": "1",
"nameCategory": "Cat1",
"rights": [{
"idRight": "1",
"name": "Right1 in Cat1",
"price": "10",
"image": "img1.jpg"
}]
}, {
"idCategory": "2",
"nameCategory": "Cat2",
"rights": [{
"idRight": "2",
"name": "Right1 in Cat2",
"price": "20",
"image": "img2.jpg"
},
{
"idRight": "3",
"name": "Right2 in Cat2",
"price": "30",
"image": "img3.jpg"
}]
}]
How to achieve that?
You need to remap your array and then initialize an array for the rights key... so, change your while loop something like this:
$json_response = array();
while($row = $result->fetch_assoc()) {
if (!isset($json_response[ $row['idCategory'] ])) {
$json_response[ $row['idCategory'] ] = [
'idCategory' => $row['idCategory'],
'nameCategory' => $row['nameCategory'],
'rights' => [],
];
}
$json_response[ $row['idCategory'] ]['rights'][] = [
'idRight' => $row['rid'],
'name' => $row['rname'],
'price' => $row['price'],
'image' => $row['rimg']
];
}
// We want the final result to ignore the keys and to create a JSON array not a JSON object
$data = [];
foreach ($json_response as $element) {
$data[] = $element;
}
echo json_encode($data);
This part of the code $json_response[ $row_array['idCategory'] ] helps to maintain a unique grouping of the data because it creates a hash based on the idCategory. An array can only have one key and since idCategory is always unique we can use that as the key for grouping on.
Then because we now have a hash-based array, we have to create a new array that is a 'real' array for when it is converted to JSON.
You do not want to use GROUP BY or GROUP_CONCAT in this situation.
I revised the code above to fit my needs, but I am having trouble to make another array of that array...
from:
...
$json_response[ $row['idCategory'] ]['rights'][] = [
'idRight' => $row['rid'],
'name' => $row['rname'],
'price' => $row['price'],
'image' => $row['rimg']
];
to:
$json_response[ $row['regCode'] ]['provinces'][] = $row['provDesc'];
actually this is a follow up question,
how about array inside array of that array...
like this:
[
{
rid: "1",
region: "REGION I", //array 1
provinces: [
{
pid: "128",
province: "ILOCOS NORTE", //array 2
cities[
"Adams", //array 3
"Bacarra"
],
"ILOCOS SUR"
]
},
{
rid: "2",
region: "REGION II",
provinces: [
"BATANES",
"CAGAYAN"
]
}
]

combine array if any value is found duplicates php

I am working with a one dimensional array in PHP. I would like to detect the presence of duplicate values, then count the number of duplicate values and out put the results. For example, given the following array:
Original Array:
Array
{
"OrderId": "1",
"ProductOrderedId": "1",
"CallerId": "1",
},
{
"OrderId": "2",
"ProductOrderedId": "2",
"CallerId": "2",
},
{
"OrderId": "2",
"ProductOrderedId": "3",
"CallerId": "2",
}
}
Expected Result:
Array
{
"OrderId": "1",
"ProductOrderedId": "1",
"CallerId": "1",
},
{
"OrderId": "2",
"ProductOrderedId": "2,3",
"CallerId": "2",
}
}
try this code hope this helpful for you.
$newArrayData = array();
$valuesProduct = array();
foreach ($fetchData as $key => $value) {
if (count($value) > 1) {
foreach ($value as $keys => $vals) {
$valuesProduct[] = $vals['ProductOrderedId'];
}
$implodeVal=implode(',',$valuesProduct);
$newArrayData[]= array('OrderId' => $value[0]['OrderId'], 'CallerId' => $value[0]['CallerId'],
"ProductOrderedId" => $implodeVal);
} else {
$newArrayData[]=array('OrderId' => $value[0]['OrderId'], 'CallerId' => $value[0]['CallerId'],
"ProductOrderedId" => $value[0]['ProductOrderedId']);
}
}
print_r($newArrayData);
you also can use this if you find it simple.
$values = array(
array(
"OrderId"=> "1",
"ProductOrderedId"=> "1",
"CallerId"=> "1",
),
array(
"OrderId"=> "4",
"ProductOrderedId"=> "2",
"CallerId"=> "2",
),
array(
"OrderId"=> "4",
"ProductOrderedId"=> "3",
"CallerId"=> "2",
)
);
$temp=array();
foreach ($values as $value) {
if(isset($temp[$value["OrderId"]])){
$temp[$value["OrderId"]]["ProductOrderedId"]=$temp[$value["OrderId"]]["ProductOrderedId"].",".$value["ProductOrderedId"];
}else{
$temp[$value["OrderId"]]=$value;
}
}
$final_array= array_values($temp);

Categories