Php json_encode array and object array - php

I need to create a json with this format:
{
"reservs": [
{
"ResId": "58",
"time": "2020-05-15 19:41:50",
"boxEntering": null,
"boxClosing": null,
"active": "1",
"UserId": "29",
"BoxId": "4",
"boxPlace": null,
"box": {
"id": "4",
"Nom": "Hortillonages",
"Lat": "49.8953",
"Lng": "2.31034",
"place": "0",
"placeMax": "9"
}
}
]
}
in entries, a $header who check the user token(not use for my problem)
$table the table returned from PDO::FETCHASSOC from sql SELECT request
My php code:
function generateJson($table, headerChecker $header){
$final = array();
foreach ($table as $item) {
$box = array(
"id" => $item["id"],
"Nom" => $item["Nom"],
"Lat" => $item["Lat"],
"Lng" => $item["Lng"],
"place" => $item["place"],
"placeMax" => $item["placeMax"]
);
$reserv = array(
"ResId" => $item["ResId"],
"time" => $item["time"],
"boxEntering" => $item["boxEntering"],
"boxClosing" => $item["boxClosing"],
"active" => $item["active"],
"UserId" => $item["UserId"],
"BoxId" => $item["BoxId"],
"boxPlace" => $item["boxPlace"],
);
$reserv["box"] = $box;
array_merge($final,$reserv);
}
$arr = array("reservs" => $table);
$header->tokenJson($arr);
echo json_encode($arr);
}
I have this result
{"reservs": [
{
"ResId": "58",
"time": "2020-05-15 19:41:50",
"boxEntering": null,
"boxClosing": null,
"active": "1",
"UserId": "29",
"BoxId": "4",
"boxPlace": null,
"id": "4",
"Nom": "Hortillonages",
"Lat": "49.8953",
"Lng": "2.31034",
"place": "0",
"placeMax": "9",
"QRID": "",
"boxToken": ""
}]
}
I think the Json format eror is in the array_merge function.
What add array function can I use to not remove the Box object

Your problem is that you are not assigning the return of array_merge and using the wrong variable $table. Just dynamically append to $final:
foreach ($table as $item) {
// this all appears good
//
$reserv["box"] = $box;
$final[] = $reserv; // append to $final
}
$arr = array("reservs" => $final); // use $final
$header->tokenJson($arr);
echo json_encode($arr);
Merge the new $reserv into $final and assign it to $final, then use $final.

Try this one
function generateJson($table, headerChecker $header){
$final = array();
foreach ($table as $item) {
$box = array(
"id" => $item["id"],
"Nom" => $item["Nom"],
"Lat" => $item["Lat"],
"Lng" => $item["Lng"],
"place" => $item["place"],
"placeMax" => $item["placeMax"]
);
$reserv = array(
"ResId" => $item["ResId"],
"time" => $item["time"],
"boxEntering" => $item["boxEntering"],
"boxClosing" => $item["boxClosing"],
"active" => $item["active"],
"UserId" => $item["UserId"],
"BoxId" => $item["BoxId"],
"boxPlace" => $item["boxPlace"],
);
$reserv["box"] = $box;
$final[] = $reserv;
}
$arr = array("reservs" => $final);
$header->tokenJson($arr);
echo json_encode($arr);
}

Related

PHP array to specified json structure

I need to get an JSON structure as following:
{
"emails": [
{
"sender": "shihas#abc.com",
"unread_count": 2,
"items": [
{
"id": "89",
"email": "shihas#abc.com",
"read": "0",
},
{
"id": "32",
"email": "shihas#abc.com",
"read": "0",
}
]
},
{
"sender": "marias123#gmail.com",
"unread_count": 0,
"items": [
{
"id": "2",
"email": "marias123#gmail.com",
"read": "1",
}
]
},
{
"sender": "gutar4320#hotmail.com",
"unread_count": 1,
"items": [
{
"id": "1",
"email": "gutar4320#hotmail.com",
"read": "0",
}
]
}
]
}
Array($hire_email):
In the below array I need to group all the details based on the email. And also count the no. of unread messages(i.e read = 0).
Array
(
[0] => Array
(
[id] => 89
[email] => shihas#abc.com
[read] => 0
)
[1] => Array
(
[id] => 32
[email] => shihas#abc.com
[read] => 0
)
[2] => Array
(
[id] => 2
[email] => marias123#gmail.com
[read] => 1
)
[3] => Array
(
[id] => 1
[email] => gutar4320#hotmail.com
[read] => 0
)
)
The following is the code snippet used for maintaining the JSON structure.
foreach($hire_email as $val) {
if($val['read']==0){ $count++; }else{ $count = 0;}
$hire_group_email[$val['email']]['sender'] = $val['email'];
$hire_group_email[$val['email']]['unread_count'] = $count;
$hire_group_email[$val['email']]['items'][] = $val;
}
$output["emails"][] = $hire_group_email;
echo json_encode($output);
This should do the trick.
$hire_email =array(
array(
"id" => "89",
"email" => "shihas#abc.com",
"read" => "0"
),
array
(
"id" => "32",
"email" => "shihas#abc.com",
"read" => "0"
),
array
(
"id" => "2",
"email" => "marias123#gmail.com",
"read" => "1"
),
array
(
"id" => "1",
"email" => "gutar4320#hotmail.com",
"read" => "0"
)
);
$tmp = array();
foreach($hire_email as $arg)
{
$tmp[$arg['email']][] = $arg;
}
$output = array();
foreach($tmp as $type => $labels)
{
$count = 0;
foreach ($labels as $value) {
if($value['read']==0){ $count++; }else{ $count = 0;}
}
$output[] = array(
'sender' => $type,
'unread_count' => $count,
'items' => $labels
);
}
echo json_encode($output);
Try doing it like this, using: array_sum and array_column, the rest is just picking out the first items values.
$array = json_decode($json, true)['emails'];
$result = [];
foreach($array as $val) {
$result[] = [
'id' => $val['items'][0]['id'],
'email' => $val['items'][0]['email'],
'read' => array_sum(array_column($val['items'], 'read'))
];
}
$output["emails"] = $result;
echo json_encode($output, JSON_PRETTY_PRINT);
Result:
{
"emails": [
{
"id": "89",
"email": "shihas#abc.com",
"read": 0
},
{
"id": "2",
"email": "marias123#gmail.com",
"read": 1
},
{
"id": "1",
"email": "gutar4320#hotmail.com",
"read": 0
}
]
}
https://3v4l.org/hi7qm
And if you want it as shown ;p (my mistake, misread it):
Loop over each item, then loop over the items and use that to build the output.
$array = json_decode($json, true)['emails'];
$result = [];
foreach($array as $val) {
foreach ($val['items'] as $item) {
$result[] = [
'id' => $item['id'],
'email' => $item['email'],
'read' => array_sum(array_column($val['items'], 'read'))
];
}
}
$output["emails"] = $result;
echo json_encode($output, JSON_PRETTY_PRINT);
Result:
{
"emails": [
{
"id": "89",
"email": "shihas#abc.com",
"read": 0
},
{
"id": "32",
"email": "shihas#abc.com",
"read": 0
},
{
"id": "2",
"email": "marias123#gmail.com",
"read": 1
},
{
"id": "1",
"email": "gutar4320#hotmail.com",
"read": 0
}
]
}
https://3v4l.org/eU95A

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

Creating nested JSON using PHP MySQL

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

Array to JSON using PHP in Codeigniter

I have an array like below:
Array ( [0] => Array ( [SI] => 1
[name] => Nick
[location] => Russia
[year] => 2011 )
[1] => Array ( [SI] => 8
[name] => Mike
[location] => Russia
[year] => 2011 )
[2] => Array ( [SI] => 2
[name] => Tom
[location] => Russia
[year] => 2010 )
[3] => Array ( [SI] => 6
[name] => Duke
[location] => Russia
[year] => 2010 ) )
Current JSON format:
{
"name": "Amalians",
"img": "https:\/\/dl.dropboxusercontent.com\/u\/19954023\/marvel_force_chart_img\/marvel.png",
"children": [
{
"name": "2011"
},
{
"children": [
{
"SI": "1"
}
]
},
{
"children": [
{
"name": "Nick"
}
]
},
{
"children": [
{
"location": "Russia"
}
]
},
{
"name": "2011"
},
{
"children": [
{
"SI": "8"
}
]
},
{
"children": [
{
"name": "Mike"
}
]
},
{
"children": [
{
"location": "Russia"
}
]
},
{
"name": "2010"
},
{
"children": [
{
"SI": "2"
}
]
},
{
"children": [
{
"name": "Tom"
}
]
},
{
"children": [
{
"location": "Russia"
}
]
},
{
"name": "2010"
},
{
"children": [
{
"SI": "6"
}
]
},
{
"children": [
{
"name": "Duke"
}
]
},
{
"children": [
{
"location": "Russia"
}
]
}
]
}
Desired JSON format:
{
"name": "marvel",
"img": "https://dl.dropboxusercontent.com/u/19954023/marvel_force_chart_img/marvel.png",
"children": [
{
"name": "2011",
"children": [
{
"SI": "1",
"name": "Nick",
"location": "Russia"
},
{
"SI": "8",
"name": "Mike",
"location": "Russia"
}
]
},
{
"name": "2010",
"children": [
{
"SI": "2",
"name": "Tom",
"location": "Russia"
},
{
"SI": "6",
"name": "Duke",
"location": "Russia"
}
]
}
]
}
CODE:
$data['name'] = "Amalians";
$data['img'] = "https://dl.dropboxusercontent.com/u/19954023/marvel_force_chart_img/marvel.png";
foreach($people as $row)
{
$data['children'][]['name'] = $row['year'];
$data['children'][]['children'][]['SI'] = $row['SI'];
$data['children'][]['children'][]['name'] = $row['name'];
$data['children'][]['children'][]['location'] = $row['location'];
}
echo "<pre>";
echo json_encode($data,JSON_PRETTY_PRINT);
echo "</pre>"; exit();
NOTE: $people is the array defined above.
Please kindly help me to do this. I have been working on this for last two days and till this moment I couldn't find any solution. Thanks
i guess the simplest way is to group your data
$arrData = [
[
"SI" => 1,
"name" => "Nick",
"location" => "Russia",
"year" => 2011
],
[
"SI" => 2,
"name" => "Mike",
"location" => "Russia",
"year" => 2011
],
[
"SI" => 3,
"name" => "Tom",
"location" => "Russia",
"year" => 2010
],
[
"SI" => 4,
"name" => "Duke",
"location" => "Russia",
"year" => 2010
],
];
$arrGroupedData = [];
foreach($arrData AS $row)
{
$arrGroupedData[$row['year']][] = [ "SI" => $row['SI'], "name" => $row['name'], "location" => $row['location']];
}
$arrGroupFormattedData = [];
foreach($arrGroupedData AS $key => $arrGroup)
{
$arrGroupFormattedData[] = ["name" => $key, "children" => $arrGroup];
}
$data = [
"name" => "Amalians",
"img" => "https://dl.dropboxusercontent.com/u/19954023/marvel_force_chart_img/marvel.png",
"children" => $arrGroupFormattedData
];
echo json_encode($data,JSON_PRETTY_PRINT);
You can try this:
Here you need to group the array by key year.
$array = array();
foreach ($people as $val) {
$array[$val['year']][] = $val;
}
$data['name'] = "Amalians";
$data['img'] = "https://dl.dropboxusercontent.com/u/19954023/marvel_force_chart_img/marvel.png";
$i = 0;
foreach ($array as $key => $value) {
foreach ($value as $key2 => $value2) {
$data['children'][$i]['name'] = $value2['year'];
$data['children'][$i]['children'][$key2]['SI'] = $value2['SI'];
$data['children'][$i]['children'][$key2]['name'] = $value2['name'];
$data['children'][$i]['children'][$key2]['location'] = $value2['location'];
}
$i++;
}
echo "<pre>";
echo json_encode($data, JSON_PRETTY_PRINT);
echo "</pre>";
exit();
<?php
$array = Array(Array( "SI" => 1,
"name" => Nick,
"location" => Russia,
"year" => 2011),
Array ( "SI" => 8,
"name" => Mike ,
"location" => Russia ,
"year" => 2011),
Array ( "SI" => 2,
"name" => Tom,
"location" => Russia,
"year" => 2010 ),
Array ( "SI" => 6,
"name" => Duke,
"location" => Russia ,
"year" => 2010 ) );
$json_final['child'] = array();
$temp = array();
foreach($array as $arr)
{
$flag=0;
if(!empty($json_final['child']))
{
foreach($json_final['child'] as $name_data)
{
if($name_data['name'] == $arr['year'])
{
$flag=1;
array_push($name_data['child_sub'],array("SI"=>$arr['SI'],"name"=>$arr['name'],"location"=>$arr['location']));
array_push($temp, $name_data);
}
}
}
if($flag == 0)
{
array_push($json_final['child'],array("name"=>$arr['year'],"child_sub"=>array(array("SI"=>$arr['SI'],"name"=>$arr['name'],"location"=>$arr['location']))));
}
}
$json_final['child'] = $temp;
//print_r($json_final);
echo json_encode($json_final,true)
?>

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

Categories