PHP Push into an array - php

I have a PHP loop that's getting data from my table and pushing it into an array.
$children = mysql_query("SELECT c.id, c.name, c.age, c.photoName, c.panelColor FROM children as c");
$temp = array();
while ($child = mysql_fetch_assoc($children)) {
// Get the child's reatings
$ratings = mysql_query('
SELECT r.behaviourID, t.points, t.typeName
FROM behaviourRatings as r
JOIN behaviourTypes as t
ON r.behaviourID = t.typeID
WHERE r.childID = ' . $child['id']);
// Loop over the ratings
$totalPoints = 0;
while ($childRatings = mysql_fetch_array($ratings)){
$totalPoints = ($totalPoints + $childRatings['points']);
}
// We can only max out at our set max
if(($totalPoints + $maxPoints) > $maxPoints) {
$total = $maxPoints;
} else if($totalPoints < 0){
$total = ($maxPoints + $totalPoints);
}else{
$total = ($maxPoints - $totalPoints);
}
// Set the child array
$temp[] = $child;
}
$response = array();
$response['timestamp'] = $currentmodif;
$response['children'] = $temp;
echo json_encode($response, JSON_PRETTY_PRINT);
I want to add another key/value to the array called points and assign its value as $total.
I tried doing $temp['points'] = $total but that put it outside of the array and not with the outer loops data.
This is the result of the function:
{
"timestamp": 1482918104,
"children": [
{
"id": "1",
"name": "Maya",
"age": "5",
"photoName": "maya.png",
"panelColor": ""
},
{
"id": "2",
"name": "Brynlee",
"age": "3",
"photoName": "brynlee.png",
"panelColor": "green"
}
]
}
I want to show the points for each of those children but I am unsure how to add it to that part of the array.

You should add it to the $child variable, just before adding that variable to the $temp array:
$child['points'] = $total;
$temp[] = $child;

Also you can reduce requests to database by getting all child's ratings in one query.
Something like this:
$children = mysql_query("SELECT c.id, c.name, c.age, c.photoName, c.panelColor FROM children as c");
$childrenIds = [];
while ($child = mysql_fetch_assoc($children)) {
$childrenIds[] = $child['id'];
}
if (!empty($childrenIds)) {
$ratings = mysql_query('
SELECT r.behaviourID, t.points, t.typeName
FROM behaviourRatings as r
JOIN behaviourTypes as t
ON r.behaviourID = t.typeID
WHERE r.childID IN (' . implode(',', $childrenIds) . ')');
}

Related

Creating Multiple JSON Object Elements Programmatically using PHP

I need to create a JSON object, in PHP, with the following form
{
"Routes": [{
"route_ID": "49",
"geom": [{
"lat": "-30.63607",
"lng": "147.499935"
}, {
"lat": "-30.63631",
"lng": "147.499868"
}]
},
{
"route_ID": "50",
"geom": [{
"lat": "-30.63607",
"lng": "147.499935"
}, {
"lat": "-30.63631",
"lng": "147.499868"
}]
}
]
}
The problem with my code is that I can't seem to find a way of concatenating the JSON elements from the $jsonString, The code as it is just produces "route_ID": "50".
(Yes I agree there are a great many questions on stackoverflow on this question, but they just about all refer to single elements derived from a static array). By the way, I am given the $jsonString and need to preprocess it in the code below.
$jsonString = "[{\"route_ID\":\"49\",\"geom\":\"<LineString><coordinates>147.499935,-30.63607 <\\/coordinates><\\/LineString>\"},{\"route_ID\":\"50\",\"geom\":\"<LineString><coordinates>147.499935,-30.63607<\\/coordinates><\\/LineString>\"}]";
/* PHP Code */
$jsonArray = json_decode($jsonString, true);
$json = new stdClass();
$json_Routes = new stdClass();
$route_geom_Array = array();
foreach ($jsonArray as $record) {
print_r($record);
$geomString = $record["geom"];
$geomString = str_replace('<LineString><coordinates>', ' ', $geomString);
$geomString = str_replace('</coordinates></LineString>', ' ', $geomString);
$geomString = trim($geomString);
$route_geom_Array = explode(' ', $geomString);
for ($i = 0; $i < sizeof($route_geom_Array); $i++) {
$var = explode(',', $route_geom_Array[$i]);
$route_geom[] = array('lat' => $var[1], 'lng' => $var[0]); // lat long
}
$json->route_ID = $record["route_ID"]; //<- Problem area
$json->geom = $route_geom; //<- Problem area
}
$json_Routes->Routes = $json;
$jsonArray = json_encode($json_Routes);
echo $jsonArray;
exit ();`
Can someone give me a clue on how do this.
Thanks
You need to make $json_Routes->Routes an array and push the $json structures within the foreach block, e.g.:
$json_Routes->Routes = [];
foreach ($jsonArray as $record) {
// Existing code ...
$json_Routes->Routes[] = $json;
}
You need to push objects to array, here solution :
$jsonArray = json_decode($jsonString, true);
$json_Routes = new stdClass();
$route_Array = [];
$route_geom_Array = [];
$route_ID_Array = [];
$items = [];
$index = 0;
foreach ($jsonArray as $record) {
//print_r($record);
$geomString = $record["geom"];
$geomString = str_replace('<LineString><coordinates>', ' ', $geomString);
$geomString = str_replace('</coordinates></LineString>', ' ', $geomString);
$geomString = trim($geomString);
$route_geom_Array = explode(' ', $geomString);
for ($i = 0; $i < sizeof($route_geom_Array); $i++) {
$var = explode(',', $route_geom_Array[$i]);
$route_geom[] = array('lat' => $var[1], 'lng' => $var[0]); // lat long
}
$json = new stdClass();
$json->route_ID = $record["route_ID"]; //<- Problem area
$json->geom = $route_geom; //<- Problem area
array_push($route_Array,$json);
}
$json_Routes->Routes = $route_Array;
$result = json_encode($json_Routes);
echo $result;
exit();

Convert JSON from MySQL to PHP

So i have this JSON in my MySQL Database
{
"11011001": {
"id": 11011001,
"name": "Test",
"price": 4,
"inCart": 7
}
}
Now i want to work with this data in PHP.
I got the JSON by doing this in PHP:
$sql = "SELECT article FROM test WHERE id = '$id'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
$aricle = $row["article"];
} else {
echo "Something went wrong";
}
After that i did this which resulted in getting a JSON Array:
$tarray = json_decode($article, TRUE);
What can i do now to get the values from the JSON?
For example i want the value of the price in a variable called $price.
$price = $tarray[11011001]['price'];
Or you can loop through the results if you have many articles
$tarray = json_decode($json,true);
foreach ($tarray as $index => $item)
{
$price[] = $item['price'];
}
var_dump($price);
Assuming you might have a collection of items, you can map the ids to prices with array_column.
<?php
$json =<<<JSON
{
"11011001": {
"id": 11011001,
"name": "Test",
"price": 4,
"inCart": 7
}
}
JSON;
$items = json_decode($json, TRUE);
$ids_prices = array_column($items, 'price', 'id');
var_export($ids_prices);
Output:
array (
11011001 => 4,
)
Only one item, but you don't know the key up front?
if(count($items) === 1) {
$item = array_pop($items);
$price = $item['price'];
}
echo $price;
Output:
4
First you have a sql injection, you must create a prepared query if you have data from users.
$sql = "SELECT article FROM test WHERE id = :id";
$query = $con->prepare($sql);
$query->bindValue(":id", $id);
$query->execute();
$result = $query->fetch();
if ($result) {
// $article will be stdClass if json correct
$article = json_decode($result['article']);
$price = $article->price;
// or $article = json_decode($result['article'], true);
// $price = $article['price'];
}
Just an example

JSON decode any value - $var1 = $data['val1']['anyvalue']['val2'];

I am pulling in JSON data for a mySQL import and in setting the variables after my JSON decode statements of my JSON file I am struggling with something. My variable setting looks like so
$name = $data['available_channels']['3']['name'];
and the relevant JSON like this
"available_channels": {
"3": {
"num": 152,
"name": "Sky Sports 3",
"stream_type": "live",
"type_name": "Live Streams",
"stream_id": "3",
"stream_icon": "http://www.tv-logo.com/pt-data/uploads/images/logo/sky_uk_sports3.jpg",
"epg_channel_id": "Sky Sports 3",
"added": "0",
"category_name": "Sports UK",
"category_id": "5",
"series_no": null,
"live": "1",
"container_extension": null,
"custom_sid": ":0:86:EEE:7F2:2:11A0000:0:0:0:",
"tv_archive": 0,
"direct_source": "",
"tv_archive_duration": 0
},
My problem is that each channel for the service begins with a new number. So i need my variables to be pulled in like so,
$name = $data['available_channels']['ANY VALUE HERE']['name'];
any thoughts? I know it must be simple and I am having a blonde moment here
Thanks
UPDATE 1
//convert json object to php associative array
$data = json_decode($jsondata, true);
//get the values and asign variables
$name = $data['available_channels']['3']['name'];
UPDATE 2
Full Code Now
$data = json_decode($jsonFile, true);
for($i = 0; $i <= count($data['available_channels']); $i++){
$name = $data['available_channels'][$i]['name'];
$num = $data['available_channels'][$i]['num'];
$epg_channel_id = $data['available_channels'][$i]['epg_channel_id'];
$category_name = $data['available_channels'][$i]['category_name'];
$stream_icon = $data['available_channels'][$i]['stream_icon'];
//insert into mysql table
$sql = "INSERT INTO channels(name, num, epg_channel_id, category_name, stream_icon)
VALUES('$name', '$num', '$epg_channel_id', '$category_name', '$stream_icon')";
if(!mysql_query($sql,$con))
{
die('Error : ' . mysql_error());
}
}
Gets about 117 of 234 rows in but the other rows are blank... any thoughts
$name = array_values($data['available_channels'])[0]['name'];
array_values returns a new array consisting of the values of the source array, renumbered from 0.
You can count the number of channels inside the array, then loop through each channel.
for($i = 0; $i <= count($data['available_channels']); $i++) {
$name = $data['available_channels'][$i]['name'];
// TODO: Do something with the name
}
Or you could do what #cske said:
$channels = [];
foreach($data['available_channels'] as $k => $v) {
// this will keep the key's the same
$channels[$k] = $v['name'];
}
Or you could choose a more OO styled approach, see it working at 3v4l:
class Channel {
private $_data;
public function __construct($json) {
$this->_data = json_decode($json, true);
}
public function parse() {
$parsed = [];
foreach($this->_data['available_channels'] as $k => $v) {
$parsed[$k] = $v['name'];
}
$this->_data['available_channels'] = $parsed;
return $this;
}
public function getByKey($key) {
return $this->_data['available_channels'][$key];
}
}
$c = new Channel($json_response);
echo 'Name for Channel 3 is: ' . $c->parse()->getByKey('3');
So after update 2, this will work
foreach($data['available_channels'] as $d) {
$name = $d['name'];
$num = $d['num'];
$epg_channel_id = $d['epg_channel_id'];
$category_name = $d['category_name'];
$stream_icon = $d['stream_icon'];
//insert into mysql table
$sql = "INSERT INTO channels(name, num, epg_channel_id, category_name, stream_icon)
VALUES('$name', '$num', '$epg_channel_id', '$category_name', '$stream_icon')";
if (!mysql_query($sql, $con)) {
die('Error : ' . mysql_error());
}
}
Or if with for loop #KDOT answer, but corrected by #Niet the Dark Absol code
$data['available_channels'] = array_values($data['available_channels']);
for($i = 0; $i <= count($data['available_channels']); $i++) {
$name = $data['available_channels'][$i]['name'];
...
}
That is simply not true if a php array has count()=5 then it's keys are 0,1,2,3,4 what couses missing rows with KDOT's answer

Php Mysql Nested Category Subcategories Json Response

I would like to display categories and subcategories as json response using php mysql. I have three level categories. I am running this query but results not coming as expected. please help me to solve this.
I need json response like below
[{
"id": "1",
"name": "Electronics",
"categorieslevelone": [{
"id": "2",
"name": "Mobiles",
"categoriesleveltwo": [{
"id": "3",
"name": "Samsung",
"parent_id": "2"
}, {
"id": "4",
"name": "Nokia",
"parent_id": "2"
}]
}]
My Code:
header('Content-Type: application/json');
$sql = "select * from category where category_id = 0";
$q = $this->db->conn_id->prepare($sql);
$q->execute();
$json_response = array();
while ($row = $q->fetch(PDO::FETCH_ASSOC)) {
$row_array = array();
$row_array['id'] = $row['id'];
$row_array['name'] = $row['name'];
$row_array['categorieslevelone'] = array();
$id = $row['id'];
$sqltwo = "select * from category where category_id = ? ";
$r = $this->db->conn_id->prepare($sqltwo);
$r->bindParam(1, $id);
$r->execute();
while ($data = $r->fetch(PDO::FETCH_ASSOC)) {
$id2 = $data['id'];
$row_array['categoriesleveltwo'] = array();
$row_array['categorieslevelone'][] = array(
'id' => $data['id'],
'name' => $data['name'],
);
$sql3 = "select * from category where category_id = ? ";
$s = $this->db->conn_id->prepare($sql3);
$s->bindParam(1, $id2);
$s->execute();
while ($list = $s->fetch(PDO::FETCH_ASSOC)) {
$row_array['categoriesleveltwo'][] = array(
'id' => $list['id'],
'name' => $list['name'],
);
}
}
array_push($json_response, $row_array); //push the values in the array
}
echo json_encode($json_response);
I'm getting a result like you mentioned above. Chenck this out. You have to convert procedural into Object oriented method.
$main_cat = array();
while($row = mysqli_fetch_assoc($query))
{
$query2 = mysqli_query($con,'Select category_id as id,category_name as name from category where parent_id = '.$row['id'].'');
$sub_cat = array();
while($row1 = mysqli_fetch_assoc($query2))
{
$query3 = mysqli_query($con,'Select category_id as id,category_name as name from category where parent_id = '.$row1['id'].'');
$sub_cat2 = array();
while($row2 = mysqli_fetch_assoc($query3))
{
array_push($sub_cat2, $row2);
}
$row1['categoriesleveltwo'] = $sub_cat2;
array_push($sub_cat, $row1);
}
$row['categorieslevelone'] = $sub_cat;
array_push($main_cat, $row);
}
echo json_encode($main_cat);
?>
Hope its will satisfy your requirement
I know this answer is already accepted, but I thought it would make nice code kata.
Code below will build tree structure from adjacency list that you have in db. There are more ways to maintain tree structures, but there's no easy way - all methods involve maintance/code efficiency trade offs.
I used references to build whole tree in one loop regardless of nested nodes number and order in which rows are fetched (would be much easier when parent node was already fetched, but would need extra attention to changes in db) - this way you could order categories alfabetically with db query.
Since it works for any nesting level all children are stored under subcategories key (opposed to categorieslevelxxx), but each subtree might be processed the same way.
...
$link = [];
$data = [];
while ($row = $q->fetch(PDO::FETCH_ASSOC)) {
$id = $row['id'];
$parent = $row['category_id'];
unset($row['category_id']);
empty($link[$id]) or $row += $link[$id];
isset($link[$parent]['subcategories']) or $link[$parent]['subcategories'] = [];
$link[$parent]['subcategories'][] = $row;
$last_idx = count($link[$parent]['subcategories']) - 1;
$link[$id] = & $link[$parent]['subcategories'][$last_idx];
}
$data = $link[1];
unset($link); //tree might be cached here.
$link[1] at the end means we want category 1 and all it's descendants, but you might take any other node. $link[0] would take entire tree when there's more root categories (category_id = 0 in db points to "virtual" root).

JSON Multi-dimensional Array using mysql_fetch_assoc

My Mysqli Updated Query and it Outputs this
SELECT milestone.id, milestone.name, milestone.date, milestone.location, milestone.story_body, milestone.short_link, milestone.created_at,
GROUP_CONCAT(images.path) as path , images.update_type
FROM milestone
INNER JOIN images ON milestone.id = images.update_id
WHERE milestone.business_id = '1' && milestone.status = '1' && images.update_type = '3'
GROUP BY milestone.id
How Can I form JSON object using above query?
I've tried below method which doesn't give any result
$result_array = array();
while($row = mysql_fetch_assoc($result))
{
$result_array[] = $row;
}
I want something like this -
[
{
"id":"4",
"name":"2nd anniversary",
"date":"2015-12-17",
"location":"Mumbai",
"story_body":"Gzjjs jdk djks jdks jdkd jx djdb djd JD djbd djdj d",
"short_link":"izWfs",
"created_at":"2015-12-11 03:49:52",
"path":
[
{"\/SupportData\/ImpalzB2B\/uploads\/90294930451448437444826.jpg"},
{"\/SupportData\/ImpalzB2B\/uploads\/90294930451449758248579.jpg"}
],
"update_type":"3"
},
{
"id":"7",
"name":"#1styearAnniversary",
"date":"2016-01-20",
"location":"Mumbai",
"story_body":"Bsjsj jdkdk djdkdk dkdkf kdkf dkfj fjfj fjfkjdd djkd",
"short_link":"FHXh0",
"created_at":"2016-01-20 23:10:54",
"path":"\/SupportData\/ImpalzB2B\/uploads\/11453356652175.jpg",
"update_type":"3"
}
]
Note: I know Mysql is not being used in PHP 7. I need to replace it with PDO & Mysqli so please neglect that mistake. I am working on same meanwhile I am facing this query.
You can do this now -
$result_array = array();
while($row = mysql_fetch_assoc($result))
{
$temp= explode(',', $row['path']); // explode by ,
if(count($temp) > 1) { // More than one element then assign
$row['path']= $temp;
}
$result_array[] = $row;
}

Categories