Why does my JSON array turn into an object? - php
I am trying to unset a value from test_bots.json and save it back, but somehow the data format is being changed in the process.
test_bots.json contains this JSON array:
["John","Vladimir","Toni","Joshua","Jessica"]
My code looks like this:
$good = 'Toni';
$good_arr = file_get_contents('test_bots.json');
$good_arr = json_decode($good_arr);
if(in_array($good, $good_arr)){
$key = array_search($good, $good_arr);
unset($good_arr[$key]);
$good_arr2 = json_encode($good_arr);
file_put_contents('test_bots.json',$good_arr2);
}
The output that's saved is:
{"0":"John","1":"Vladimir","3":"Joshua","4":"Jessica"}
but I want the output to look like:
["John","Vladimir","Joshua","Jessica"]
I tried to unserialize the array before saving it, but it's not working.
Why is this happening?
In order for json_encode to convert a PHP array with numeric keys to a JSON array rather than a JSON object, the keys must be sequential. (See example #4 in the PHP manual for json_encode.)
You can accomplish this in your code by using array_values, which will reindex the array after you have removed one of the items.
$good_arr2 = json_encode(array_values($good_arr));
Related
PHP JSON Arrays within an Array
I have a script that loops through and retrieves some specified values and adds them to a php array. I then have it return the value to this script: //Returns the php array to loop through $test_list= $db->DatabaseRequest($testing); //Loops through the $test_list array and retrieves a row for each value foreach ($test_list as $id => $test) { $getList = $db->getTest($test['id']); $id_export[] = $getList ; } print(json_encode($id_export)); This returns a JSON value of: [[{"id":1,"amount":2,"type":"0"}], [{"id":2,"amount":25,"type":"0"}]] This is causing problems when I try to parse the data onto my android App. The result needs to be something like this: [{"id":1,"amount":2,"type":"0"}, {"id":2,"amount":25,"type":"0"}] I realize that the loop is adding the array into another array. My question is how can I loop through a php array and put or keep all of those values into an array and output them in the JSON format above?
of course I think $getList contains an array you database's columns, use $id_export[] = $getList[0] Maybe can do some checks to verify if your $getList array is effectively 1 size
$db->getTest() seems to be returning an array of a single object, maybe more, which you are then adding to a new array. Try one of the following: If there will only ever be one row, just get the 0 index (the simplest): $id_export[] = $db->getTest($test['id'])[0]; Or get the current array item: $getList = $db->getTest($test['id']); $id_export[] = current($getList); //optionally reset() If there may be more than one row, merge them (probably a better and safer idea regardless): $getList = $db->getTest($test['id']); $id_export = array_merge((array)$id_export, $getList);
Adding serialized data to an array - PHP
I have a three serialized data structures. a:2:{i:0;s:151:"[["1","0","0","1","0","0","1","0","1","0","0","0"],["1","0","0","0","1","0","0","0","1","0","1","1"],["1","0","1","0","1","0","1","0","1","0","0","1"]]";i:1;s:151:"[["1","0","1","0","1","0","1","0","1","0","1","0"],["1","0","1","0","1","1","0","1","0","1","0","1"],["1","0","1","0","1","0","1","1","1","0","1","1"]]";} a:2:{i:0;s:163:"[["10","0","0","0","30","0","0","60","0","0","0","0"],["20","0","0","30","0","0","20","0","0","0","50","0"],["30","0","0","0","20","0","0","30","0","20","0","30"]]";i:1;s:154:"[["20","0","0","0","0","0","0","0","0","0","0","0"],["30","0","0","0","0","0","0","0","0","0","0","0"],["40","0","0","0","0","0","0","0","0","0","0","0"]]";} a:4:{i:0;s:151:"[["1","0","0","1","0","0","1","0","1","0","0","0"],["1","0","0","0","1","0","0","0","1","0","1","1"],["1","0","1","0","1","0","1","0","1","0","0","1"]]";i:1;s:151:"[["1","0","1","0","1","0","1","0","1","0","1","0"],["1","0","1","0","1","1","0","1","0","1","0","1"],["1","0","1","0","1","0","1","1","1","0","1","1"]]";i:2;s:151:"[["1","1","1","0","1","1","1","0","0","0","1","1"],["1","1","1","0","0","1","1","1","1","0","1","1"],["1","1","1","1","0","0","1","1","1","1","1","1"]]";i:3;s:151:"[["1","0","1","0","0","0","1","0","1","0","0","2"],["1","0","0","2","1","0","1","0","1","1","0","1"],["1","0","2","1","1","1","0","1","0","1","1","1"]]";} I want to add all three serialized data into a single serialized array. I tried this code and its work, but I want to be able to add additional data. $data2=unserialize($value['monthly_forecast']); $data1=unserialize($temp['monthly_forecast']); //print_r($data1); $combinedData = array($data1, $data2); $monthly_forecast=serialize($combinedData); $temp['monthly_forecast']=$monthly_forecast;
What about unserialize then array_merge() and then serialize the merged array back? Note that array_merge() can be used to Merge one or more arrays so you should be able to apply it in your case. Edit: You have a couple of options. You can either unserialize and merge everything into a single array and then serialize that. Or, you can also: $array = array($serialized_data_1, $serialized_data_2, $serialized_data_3); $all_serialized = serialize($array); And then, to access the data: $all_unserialized = unserialize($array); $unserialized_data_1 = unserialize(all_unserialized[0]); $unserialized_data_2 = unserialize(all_unserialized[1]); $unserialized_data_3 = unserialize(all_unserialized[2]);
Serialized multidimensional stored in MySQLi does not print past first array
Confusing title, the basics are that I'm saving a fully sorted and ordered multidimensional array from a script and into MySQL. I then, on another page, pull it from the database and unserialize it, and then proceed to print it out with this, $s = "SELECT * FROM gator_historical_data WHERE channelid = '{$chanid}'"; $r = $link->query($s); $comboarray = array(); while ($row = mysqli_fetch_assoc($r)) { $comboarray[] = unserialize($row['dataarray']); } foreach ($comboarray as $item) { $desc = $item['content']['description']; $title = $item['content']['title']; $datetime = $item['datetime']; // ... ^^^ problems getting array data } The problem is that it doesn't take the full array from MySQL, only the first entry and thus only prints the first 'array'. So where the returned value from dataarray looks like this (var_dump): http://pastebin.com/raw.php?i=Z0jy55sM the data stored into the unserialized $comboarray only looks like this (var_dump): http://pastebin.com/raw.php?i=Ycwwa924 TL;DR: Pulling a serialized multidimensional array from a database, unserializing and it loses all arrays after the first one. Any ideas what to do?
The string you've got is a serialized string plus something more at the end that is also a serialized string again and again: a:3:{s:6:"source";s:25:"World news | The Guardian";s:8:"datetime ... ... story01.htm";}}a:3:{s:6:"source";s:16:"BBC News - World"; ^^^ This format is not supported by PHP unserialize, it will only unserialize the first chunk and drop everything at the end. Instead create one array, serialize it and store that result into the database. Alternatively you can try to recover for the moment by un-chunking the string, however in case the paste was done right, there are more issues. But on the other hand the paste obvious isn't the done fully correct.
Push array into JSON but got unwanted result
I suck at formatting, maybe I had a bad foundation. I have a json like this 'first_name'=>'steve', 'msg'=>'something here','profile_id'=>1 and I want to push a new item into it, I wrote $i = array('first_name'=>'steve', 'msg'=>'something here','profile_id'=>1); $loginId = array($_GET['login_id']); array_push($i,$loginId); echo json_encode($i); The result I got is strange:
$i = array('first_name'=>'steve', 'msg'=>'something here','profile_id'=>1); $loginId = $_GET['login_id']; $i['login_id']=$loginId; echo json_encode($i); The reason array_push didn't work is because you are treating $i as an array (collection) of objects (arrays), while it is just a key-value list (map). If the array is like K1=>V1, K2=>V2, use $arr[K3]=V3 to add another pair. If the array is like [(k1,v1), (k2,v2)], then array_push($arr,(k3,v3));
You are basically taking a value $_GET['login_id'], placing it in an array and trying to push it into an associate array, so you you get a new numeric index 0 holding a nested array, which in turn holds your value. If you want the entire thing to be treated uniformly as an associative array (or an object once converted to JSON) then you should do something like: $i = array('first_name'=>'steve', 'msg'=>'something here','profile_id'=>1); $i['login_id'] = $_GET['login_id']; echo json_encode($i);
How to get json element's property from Entire Json in PHP
My json value looks like this: [{"Id":"1169"},{"Id":"1164"},{"Id":"1163"},{"Id":"1162"},{"Id":"1161"}] Now i want to store only numeric values 1169,1164,1163,1162,1161 into different array.How can i do this?
Simple $values = array_values(json_decode($json,true));
its not array its a json. You can change from array to json and json to array. $a = json_encode($yourArray); AND $b= json_decode($yourJson);