Print specific value from JSON object with JS - php

I am new to JSON. I have a JSON String. I want to access the data and print it to a DIV which i get working like this:
document.getElementById("product_content").innerHTML=javascript_array[5].name;
The JSON looks like this:
$data[] = array(
"id" => $product->virtuemart_product_id,
"name" => $product->product_name
);
which has already been encoded and works.
How would i get a specific value using a id to retrieve the name eg:
document.getElementById("product_content").innerHTML=javascript_array["id" == 3].name;
instead of using the row number i say where "id" == 3 like "id" == 3
Thanks for the help

If you can rework the PHP to this you'll be in a better position
$data[$product->virtuemart_product_id] = array(
"name" => $product->product_name
);
This will set the ID as the key, rather than as additional element of the contained array. You should then be able to do
javascript_array[5]
If you are expecting strings too you should do
javascript_array["a_string"]
Or
javascript_array.a_string

Related

How to update JSON field in database with non-primitive value?

The json column in the database has a data like this:
{"data": {"total":15,"time":25}}
This is the data I want to update within it:
{"total":22,"time":5}
But when updating the data via Laravel like this:
$json_data = json_encode(['total' => 22, ...]);
$table->where->update(['column->data' => $json_data])
the result is as follows:
{"data": "{\"total\":22,\"time\":5}"}
When I pass the array without json_encodeing it, it raises an error instead.
How can I assign a non-primitive value directly to a property in a JSON field?
I think the only solution is as follows:
$data = ['total' => 22, 'time' => 5];
$table->where->update([
'column->data->total' => $data['total'] ,
'column->data->time' => $data['time']
])
I searched to batch update the contents of a json key without double quotes but couldn't find it.
Either the content will be pulled completely and then edited and sent again. Or individual updates will be made as above. Please let me know if you find a better solution.
seems it got double json encoded, first you json_encode'ed it manually, then the $table->where->update-function json_encode'ed it again. try replacing
$json_data = json_encode(['total' => 22, ...]);
with just
$json_data = ['total' => 22, ...];

Programatically extending an array with sub arrays

I have a working array as follows
"content" => array
(
array //sub array for image 1
(
'url' => $uploadspath.$media_url0,//main image
"type" =>$type0,//media type
"caption"=>$caption0
),
array //sub array for image 2
(
'url' => $uploadspath.$media_url1,//main image
"type" =>$type1,//media type
"caption"=>$caption1
),
array //sub array for image 3
(
'url' => $uploadspath.$media_url2,//main image
"type" =>$type2,//media type
"caption"=>$caption2
),
....Programatically add new sub arrays here subject to the existence of $media_url(4,5,6 etc)..
);
I am getting the $media_url and other data from database. I would like too programatically extend the array by adding additional sub arrays and associated URL/type/caption elements IF there is a value for $media_url4; $media_url5; $media_url6; $media_url7; etc. etc. (Max 10 images)
My problem is how to code the extension of my array with additional sub-arrays based purely on the existence of additional media_urls. Simplistically I would like to be able to do something along the following lines but I don't know how to implement it within a nested array structure...
if ($media_url4) {code to add sub array/element for image 4}
if ($media_url5) {code to add sub array/elementsfor image 5}
etc...
Thank you for any assistance.
//Below we have a function or pdo function that return the new values from database that you want to put in the CONTENT MASTER ARRAY, NOW we put the values in a variable $rows
$rows = functionThatReturnNewValuesToPutInContentArray();
//The foreach looping the variable rows, getting each row in database and putting this in a variable $row
foreach($rows as $row){
//If the $row object data from database contains media_url value add new subarray to masterContentArray
if($row->media_url != ''){
$newSubArray = [
//$row->media_url, is considering that you have a column in your db named by media_url, and that contains url string
'url'=>$row->uploadsPath . $row->media_url,
'type'=>$row->type,
'caption'=>$row->caption,
];
array_push($masterContentArray['content'], $newSubArray);
}
}
return json_encode($content);

How to edit data sql for Json output

I want to add this symbol [ ] to the column "Post_images"
with basis data sql server
Like this,
“post_images” : “ht tp://img*sample*com/gambar1*jpg”, “ht tp://img*sample*com/gambar2*jpg”
to
“post_images” : [“ht tp://img*sample*com/gambar1*jpg”, “ht tp://img*sample*com/gambar2*jpg”]
In json the [] indicates a set of items.
Assuming you have an array with both strings inside then calling json_encode(array) should add the [ ].
See also this tutorial for more detais.
http://www.tutorialspoint.com/json/json_php_example.htm
Please do not write json on your own. Use the php functions instead.
You have to place array for post_images
it mean if you have $data which you json_encodeing you should add your post images as sub array not string. Example
$data = array(
'param1' => "data ...",
'post_images' => array(
“ht tp://img*sample*com/gambar1*jpg”,
“ht tp://img*sample*com/gambar1*jpg”
);
);
echo json_encode($data); // will output what you where looking for
Do the the following:
'["ht tp://imgsamplecom/gambar1*jpg", "ht tp://imgsamplecom/gambar2*jpg"]'
Example:
http://sqlfiddle.com/#!9/971279/1

add value to JSON of title

I search a lot in stack and google try to find the answer which seems to be easy but I'm still stuck with it
I write a code to encode json with values I wanted from . and I would like to add a key / value to the JSON
the JSON is as following structure
{
- files: [
{
title: "works",
- tracks: [
{
title: "File",
format: "mp3"
}
]
},
-{
title: "season1",
tracks: [
{
title: "Button-1",
format: "wav"
},
-{
title: "Beep-9",
format: "wav"
}
]
}
]
}
I want to add to that a key and its value at the beginning to the json as properties under the title files , I mean that can be read by code as
json[files][new_key]
I tried to set that value like this
$json['new_key'] = "new_value";
but this causes adding numbers to the arrays in json , I don't why they numbered
this numbers affect my reading way of the json as JSONModel in my iOS app
so , I hope you can help me
thanks in advance
Assuming that the new value you want to add varies by file, you would need to loop through $json[files] and insert them per key/value pair.
<?php
for($i=0; $i<count($json); $i++)
$json[files][$i]["new_key"] = "value";
?>
I'm still not sure what you have exactly, but it seems you are trying to manipulate the json string.
If done correctly, that is probably the most efficient solution, but what you could also do is:
use json_decode to generate an array from your json string;
locate the correct section / sub-array where you want to add your data;
use array_unshift to prepend your new key - value pair;
use json_encode to generate a json string from your complete array.
The reason you're getting numbers appearing is because you're adding a key to an array (which functions more or less as a list in JS). So before you basically have the object "files" as a list of objects zero-indexed like any other JS array. When you add the key, JS simply adds your key to the end of your present keys (in your case 0 and 1).
It seems like you have a list of multimedia objects where each has a title and a list of tracks. The most straightforward way to solve your issue would be as follows:
$fileItem['title'] = 'works';
$fileItem['tracks'] = array(
array(
'title' => 'File',
'format' => 'mp3'
)
);
$json['files'][] = $fileItem;
$fileItem['title'] = 'season1';
$fileItem['tracks'] = array(
array(
'title' => 'Button-1',
'format' => 'wav'
),
array(
'title' => 'Beep-9',
'format' => 'wav'
)
);
$json['files'][] = $fileItem;
Then you JSON encode it and return it as you normally would. You can put the above in a loop as well. I lack enough context to recommend exactly how.

Dynamically add data stored in php to nested json

I am trying to dynamicaly generate data in json for jQuery gantt chart. I know PHP but am totally green with JavaScript. I have read dozen of solutions on how dynamicaly add data to json, and tried few dozens of combinations and nothing. Here is the json format:
var data = [{
name: "Sprint 0",
desc: "Analysis",
values: [{
from: "/Date(1320192000000)/",
to: "/Date(1322401600000)/",
label: "Requirement Gathering",
customClass: "ganttRed"
}]
},{
name: " ",
desc: "Scoping",
values: [{
from: "/Date(1322611200000)/",
to: "/Date(1323302400000)/",
label: "Scoping",
customClass: "ganttRed"
}]
}, <!-- Somoe more data-->
}];
now I have all data in php db result. Here it goes:
$rows=$db->fetchAllRows($result);
$rowsNum=count($rows);
And this is how I wanted to create json out of it:
var data='';
<?php foreach ($rows as $row){ ?>
data['name']="<?php echo $row['name'];?>";
data['desc']="<?php echo $row['desc'];?>";
data['values'] = {"from" : "/Date(<?php echo $row['from'];?>)/", "to" : "/Date(<?php echo $row['to'];?>)/", "label" : "<?php echo $row['label'];?>", "customClass" : "ganttOrange"};
}
However this does not work. I have tried without loop and replacing php variables with plain text just to check, but it did not work either. Displays chart without added items. If I add new item by adding it to the list of values, it works. So there is no problem with the Gantt itself or paths. Based on all above I assume the problem is with adding plain data to json. Can anyone please help me to fix it?
First of all you're adding properties to string instead of building object. If you really want to do that this way:
var data = [], row;
<?php foreach ($rows as $row) : ?>
row = {};
row.name ="<?php echo $row['name'];?>";
row.desc ="<?php echo $row['desc'];?>";
row.values = {"from" : "/Date(<?php echo $row['from'];?>)/", "to" : "/Date(<?php echo $row['to'];?>)/", "label" : "<?php echo $row['label'];?>", "customClass" : "ganttOrange"};
data.push(row);
<?php endforeach; ?>
Anyway it is unsafe (and result is normal JS code, not proper JSON object - but as you're assigning it to variable then I suppose it does not have to be in strict JSON format)
Better approach would be to build data structure in PHP and use json_encode function to generate JSON data for JavaScript:
<?php
$data = array();
foreach ($rows as $row) {
$data[] = array(
'name' => $row['name'],
'desc' => $row['desc'],
'values' => array(array(
'from' => '/Date('.$row['from'].'>)/',
'to' => '/Date('.$row['to'].')/',
'label' => $row['label'],
'customClass' => 'ganttOrange',
))
);
}
?>
var data = <?php echo json_encode($data); ?>;
Quick Answer
As stated previously, this problem is easily resolved using the PHP json_encode function.
The trick to understanding how to do this easily is to understand the composite data structure that you are trying to work with.
Overview
What you are dealing with is a general programming concept called a "composite data structure". The trick to understanding this is to realize that the PHP and the JavaScript that you are attempting to manage are just two different representations of the exact same thing.
Once this concept sinks in, it will be easy to relate to what the users Musa and dev-null-dweller have already explained.
The straightforward way to solve this issue is to simply build a composite data structure in PHP and then translate it into JSON (aka JavaScript) using the built-in native methods of PHP's json_encode and json_decode.
Instead of doing all the statements, you should treat each $row as a composite data structure and use the PHP json functions.
The following example should give you a head start, simply compare it to the data you are trying to work with and change accordingly.
Example 001
// This is a PHP composite data structure [ a nested array ]
// represented in PHP. When you run this code you will get the
// output of Result 001
$user_profile = Array(
main => Array(
first_name => "_blank_",
last_name => "_blank_",
sex => "_blank_",
age => "_blank_",
),
guardian => Array(
first_name => "",
last_name => "",
),
children => Array(
0 => Array(
first_name => "Sally",
last_name => "Shaw",
),
1 => Array(
first_name => "Scott",
last_name => "Shaw",
),
),
);
// This is some sample PHP code you can use to modify
// the composite data structure (modify the "_blank_" values)
//
$user_profile["main"]["first_name"] = "Archibald";
$user_profile["main"]["last_name"] = "Shaw";
$user_profile["main"]["age"] = "33";
$user_profile["main"]["sex"] = "male";
// This is some sample PHP code you can use to modify
// the composite data structure (add a new child)
//
$user_profile["children"][2] = Array();
$user_profile["children"][2]["first_name"] = "Carrie";
$user_profile["children"][2]["last_name"] = "Shaw";
// This is the PHP code you can use to transform from PHP to JSON
$result = json_encode( $user_profile );
print_r( $result );
Result 001 (formatted for easy readability)
{
"main":{
"first_name":"Archibald",
"last_name":"Shaw",
"sex":"male",
"age":"33"
},
"guardian":{
"first_name":"",
"last_name":""
},
"children":[
{
"first_name":"Sally",
"last_name":"Shaw"
},
{
"first_name":"Scott",
"last_name":"Shaw"
},
{
"first_name":"Carrie",
"last_name":"Shaw"
}
]
}
Conclusion
Using the example above, you should first do a print_r of the PHP variable you are trying to work with and get an idea of the overall structure. Once you know this, it is an easy step to convert it to JSON using the built-in PHP json_encode function.
References
http://en.wikibooks.org/wiki/PHP_Programming/Data_Structures#The_Basics
http://en.wikipedia.org/wiki/Composite_type
var data=[];
<?php
foreach ($rows as $row)
{
$obj = array(
'name' => $row['name'],
'desc' => $row['desc'],
'values' => array(
array(
"from" => "/Date({$row['from']})/",
"to" => "/Date({$row['to']})/",
"label" => $row['label'],
"customClass" => "ganttOrange",
)
)
);
$objJson = json_encode($obj);
echo "data.push({$objJson});\n";
}
?>
You should create the data structure in php and echo it out with json_encode.
<?php
$data = array();
foreach ($rows as $row){
$item = array();
$item['name']=$row['name'];
$item['desc']=$row['desc'];
$item['values']= array("from" => "/Date{$row['from']})/",
"to" => "/Date({$row['to']})/",
"label" => $row['label'],
"customClass" => "ganttOrange");
$data[] = $item;
}
echo "\nvar data = ".json_encode($data).";\n";

Categories