I have here a multidimensional array.
{
"date_start": [
"2013-09-30",
"2013-09-27",
],
"time_start": [
"2013-09-30 08:41:00",
"2013-09-27 09:01:00",
],
"time_out": [
"2013-09-30 18:37:00",
"2013-09-27 21:11:00",
],
}
Is it possible to convert this to a linear array? to something like this?
{
[{"date_start":"2013-09-30","time_start":"2013-09-30 08:41:00","time_out":"2013-09-30 18:37:00"},
{"date_start":"2013-09-27","time_start":"2013-09-30 09:01:00","time_out":"2013-09-30 21:11:00"}]
}
I'm having a hard time to think how to do it T_T. thanks for anyone who could help me.
UPDATE:
This is now my updated work. Thanks to Nil'z for enlightening me to use decode. Just need a little more tweek.
$data_en = json_encode($data);
$data_de = json_decode($data_en, true);
$test = array();
foreach($data_de as $key => $value)
{
echo $key."<br/>";
foreach($value as $k => $v)
{
echo "$k |";
echo json_encode($v)."<br/>";
}
}
Here is now the output but still need to work something out:
date_start
0 |"2013-09-30"
1 |"2013-09-27"
time_start
0 |"2013-09-30 08:41:00"
1 |"2013-09-27 09:01:00"
time_out
0 |"2013-09-30 18:37:00"
1 |"2013-09-27 21:11:00"
If its JSON try like this:
<?php
$data = array();
$array = json_decode( $mainArray ); #decode the JSON
foreach( $array as $key => $each ){
$data[$key]['date_start'] = $each['date_start'];
$data[$key]['time_start'] = $each['time_start'];
$data[$key]['time_out'] = $each['time_out'];
}
#again encode the JSON
$data = json_encode( $data );
print_r( $data );
?>
You could try with recursive function:
function array_multi_to_linear($arr) {
static $rez;
foreach($arr as $v) {
if (is_array($v)) {
array_multi_to_linear($v);
} else {
$rez[] =$v;
}
}
return $rez;
}
Related
I'm trying to loop through a JSON that I post to my PHP backend. The JSON looks like this:
[
{
"number":"5613106"
},
{
"number":"56131064"
},
{
"number":"56131063"
}
]
I post it from Postman like so:
I want to be able to print each number that I've posted individually using
echo $number;
Right now when I use the following it just prints the last number:
$number = $json['number'];
echo $number;
My function:
public function check_users_post()
{
$json = $this->request->body;
print_r($json);
$this->response($json, REST_Controller::HTTP_OK);
}
The output:
Array
(
[0] => Array
(
[number] => 5613106
)
[1] => Array
(
[number] => 56131064
)
[2] => Array
(
[number] => 56131063
)
)
Hope this generic iterator will help you.
$jsonIterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator(json_decode($json, TRUE)),
RecursiveIteratorIterator::SELF_FIRST);
foreach ($jsonIterator as $key => $val) {
if(is_array($val)) {
echo "$key:\n";
} else {
echo "$key => $val\n";
}
}
Use
json_decode()
PHP built in function for decoding json back to PHP variable or array and then loop through each index and print number.
Got it done like this:
public function check_users_post()
{
$json = $this->request->body;
$jsonIterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator($json),
RecursiveIteratorIterator::SELF_FIRST);
$phone_numbers = "";
foreach ($jsonIterator as $key => $val) {
if(is_array($val)) {
} else {
$phone_numbers = "$phone_numbers" . ", " . "$val";
}
}
$phone_numbers = substr($phone_numbers, 2);
$phone_numbers = "(" . $phone_numbers . ")";
$query = $this->db->query("SELECT * FROM users WHERE user_number in $phone_numbers;");
$result = $query->result();
$this->response($result, REST_Controller::HTTP_OK);
if (mysql_num_rows($result)==0) {
$data = [ 'message' => 'No users returned'];
$this->response($data, REST_Controller::HTTP_BAD_REQUEST);
} else {
$this->response($result, REST_Controller::HTTP_OK);
}
}
Description
First stringify your JSON, than use JSON_DECODE() function which gives you the array afterwards iterate on this array using foreach loop which will give you the each key which you want to echo.
Code
$str = '[
{
"number":"5613106"
},
{
"number":"56131064"
},
{
"number":"56131063"
}
]';
$array = json_decode($str, true);
echo "<pre>";
foreach ($array as $key => $key_value) { // then loop through it
echo "<br>";
echo $array[$key]['number'];
echo "<br>";
}
Output
5613106
56131064
56131063
I want to find index of key from json array similar to this question Get index of a key in json
but i need the solution using php.
here is my json (partial data)
{
"currentOver":{
"events":[]
},
"matchString":"",
"currentPlayer":5,
"previousOvers":[],
"innings":[],
"scorecards":[
{
"batting":{
"players":[
{"id":16447,"name":"Rahul Roy"},
{"id":12633,"name":"Sijal Thomas"},
{"id":16446,"name":"Mohammed Reza"},
{"id":16509,"name":"Asif Khan"},
{"id":12633,"name":"Koyel Dijesh"},
{"id":16468,"name":"Shahrook"},
{"id":64691,"name":"Shafiq"},
{"id":6518,"name":"Ubaidulah"}
]
}
}
]
}
and php
foreach ($read_json->scorecards->batting->players as $batsmen => $val) {
if($val == 5) { // if batsman index is 5 then display his name
$name = $batsmen->name;
echo "<div>$name</div>\n";
}
}
Please help me to solve this issue.Thanks in advance.
I think this would suffice your requirement
http://codepad.org/XQDCKAsB
Find the code sample below as well.
$json = '{"currentOver":{"events": []},"matchString":"","currentPlayer":5,"previousOvers":[],"innings":[],"scorecards":[{"batting":{"players":[{"id":16447,"name":"Rahul Roy"},{"id":12633,"name":"Sijal Thomas"},{"id":16446,"name":"Mohammed Reza"},{"id":16509,"name":"Asif Khan"},{"id":12633,"name":"Koyel Dijesh"},{"id":16468,"name":"Shahrook"},{"id":64691,"name":"Shafiq"},{"id":6518,"name":"Ubaidulah"}]}}]}';
$arr = json_decode($json);
echo '<pre>';
$currentPlayer = $arr->currentPlayer;
echo $arr->scorecards[0]->batting->players[$currentPlayer-1]->name;
Try this code.
$info = json_decode('json string');
$currentPlayer = $info->currentPlayer;
$batsman = $info->scorecards[0]->batting->players[$currentPlayer];
echo "<div>{$batsman->name}</div>\n";
Also, note that arrays in PHP are zero-based. If currentPlayer index in json data is based on 1 (rare case, but it exists sometimes) you will ned to use
$batsman = $info->scorecards[0]->batting->players[$currentPlayer - 1];
to get right item from array.
If you just want to fix your foreach
$read_json->scorecards->batting should become $read_json->scorecards[0]->batting
if($val == 5) should become if($batsmen == 5)
$name = $batsmen->name; should become $name = $val->name;
You need to use json_decode and array_keys for the array keys from the json.
$json = '{ "key1" : "watevr1", "key2" : "watevr2", "key3" : "watevr3" }';
$result = json_decode ($json, true);
$keys = array_keys($result);
print_r($keys); //Array ( [0] => key1 [1] => key2 [2] => key3 )
In Php, You can use the code below, if you wan to fix it using foreach loop
foreach($json->entries as $row)
{
foreach($row as $key => $val)
{
echo $key . ': ' . $val;
echo '<br>';
}
}
please have a look following code
$json=json_decode($data)->scorecards[0]->batting->players;
foreach ($json as $key => $value) {
if($key==5){
echo $value->name ;
}
}
You can do it using converting JSON string to Array
$json_str = '{
"currentOver":{
"events":[]
},
"matchString":"",
"currentPlayer":5,
"previousOvers":[],
"innings":[],
"scorecards":[
{
"batting":{
"players":[
{"id":16447,"name":"Rahul Roy"},
{"id":12633,"name":"Sijal Thomas"},
{"id":16446,"name":"Mohammed Reza"},
{"id":16509,"name":"Asif Khan"},
{"id":12633,"name":"Koyel Dijesh"},
{"id":16468,"name":"Shahrook"},
{"id":64691,"name":"Shafiq"},
{"id":6518,"name":"Ubaidulah"}
]
}
}
]
}';
Decode your JSON string using "json_decode" and you get array
$json_decode_str = json_decode($json_str, true);
Now using foreach you can do anything
if($json_decode_str['scorecards']){
foreach($json_decode_str['scorecards'] as $scorecard){
$player_index = 1;
if($scorecard['batting']['players']){
foreach($scorecard['batting']['players'] as $player){
if($player_index == 5){
echo $player['name'];
}
$player_index++;
}
}
}
}
Maybe this one help you :)
Suppose, i have the fallowing json:
{
"foo.bar": 1
}
and i want to save this like this:
$array["foo"]["bar"] = 1
but i also can have more than 2 "parameters" in string. For example:
{
"foo.bar.another_foo.another_bar": 1
}
and i want to save this same way.
$array["foo"]["bar"]["another_foo"]["another_bar"] = 1
Any ideas how can i do that in case that i don't know how many parameters i have?
This is far from the nicest solution, but I've been programming all day so I'm a little tired, but I hope it gives you something to work off, or at least a working solution for the time being.
Here's the IDEone of it working: click
And here's the code:
$json = '{
"foo.bar": 1
}';
$decoded = json_decode($json, true);
$data = array();
foreach ($decoded as $key => $value) {
$keys = explode('.', $key);
$data[] = buildNestedArray($keys, $value);
}
print_r($data);
function buildNestedArray($keys, $value) {
$new = array();
foreach ($keys as $key) {
if (empty($new)) {
$new[$key] = $value;
} else {
array_walk_recursive($new, function(&$item) use ($key, $value) {
if ($item === $value) {
$item = array($key => $value);
}
});
}
}
return $new;
}
Output:
Array
(
[0] => Array
(
[foo] => Array
(
[bar] => 1
)
)
)
Wasn't sure whether your JSON string could have multiples or not so I made it handle the former.
Hope it helps, may come back and clean it up a bit in the future.
Start with a json_decode
Then build a foreach loop to break apart the keys and pass them to some kind of recursive function that creates the values.
$old_stuff = json_decode($json_string);
$new_stuff = array();
foreach ($old_stuff AS $key => $value)
{
$parts = explode('.', $key);
create_parts($new_stuff, $parts, $value);
}
Then write your recursive function:
function create_parts(&$new_stuff, $parts, $value)
{
$part = array_shift($parts);
if (!array_key_exists($part, $new_stuff)
{
$new_stuff[$part] = array();
}
if (!empty($parts)
{
create_parts($new_stuff[$part], $parts, $value);
}
else
{
$new_stuff = $value;
}
}
I have not tested this code so don't expect to just cut and past but the strategy should work. Notice that $new_stuff is passed by reference to the recursive function. This is very important.
Try the following trick for "reformatting" into json string which will fit the expected array structure:
$json = '{
"foo.bar.another_foo.another_bar": 1
}';
$decoded = json_decode($json, TRUE);
$new_json = "{";
$key = key($decoded);
$keys = explode('.', $key);
$final_value = $decoded[$key];
$len = count($keys);
foreach ($keys as $k => $v) {
if ($k == 0) {
$new_json .= "\"$v\"";
} else {
$new_json .= ":{\"$v\"";
}
if ($k == $len - 1) $new_json .= ":$final_value";
}
$new_json .= str_repeat("}", $len);
var_dump($new_json); // '{"foo":{"bar":{"another_foo":{"another_bar":1}}}}'
$new_arr = json_decode($new_json, true);
var_dump($new_arr);
// the output:
array (size=1)
'foo' =>
array (size=1)
'bar' =>
array (size=1)
'another_foo' =>
array (size=1)
'another_bar' => int 1
I would like to read the following JSON info in PHP using a foreach. Im new to this and need some help. I have only included a small sample of the data for privacy reasons.
The end goal is to get all the "id" and the "real_address" in the server array.
[
{
"id":"d87df8g7sdfg89",
"status":false,
"servers":[
{
"status":false,
"platform":null,
"server_id":"adsfasdfasdfasdf",
"virt_address6":"fd00:c0a8:f800:0:192:168:248:5",
"virt_address":"192.168.248.5",
"name":"Private",
"real_address":null,
"connected_since":null,
"id":"aasdfasdfasdfsafde",
"device_name":null
}
],
},
{
"id":"asd89asd8f",
"status":true,
"servers":[
{
"status":true,
"platform":"linux",
"server_id":"fasdsdfasdfasdf",
"virt_address6":"fd00:c0a8:f800:0:192:168:248:3",
"virt_address":"192.168.248.3",
"name":"Private",
"real_address":"5.5.5.52",
"connected_since":1447406908,
"id":"asdfasdfasdfasdf",
"device_name":"thriving-fields-2667"
}
],
}
]
You can use json_decode
$data = json_decode($json, true);
foreach ($data as $value) {
foreach ($value['servers'] as $server) {
echo $server['real_address'];
}
}
something like this ...
$items = json_decode($json);
foreach($items as $item){
foreach($item->servers as $server)
{
echo $server->server_id . " - ". $server->status;
}
}
If you have PHP >= 5.5.0 for array_column() you can try this:
$array = json_decode($json, true);
foreach (array_column($array, 'servers') as $server) {
echo $server['real_address'];
}
I have two array like below:
$array1 = array(
[0]=>array([0]=>a_a [1]=>aa)
[1]=>array([0]=>b_b [1]=>bb)
[3]=>array([0]=>c_c [1]=>cc)
)
$array2 = array(
[0]=>array([0]=>aa [1]=>AA)
[1]=>array([0]=>bb [1]=>BB)
[3]=>array([0]=>cc [1]=>CC)
)
what i would like to merge or overlap to output like below:
$result = array(
[0]=>array([0]=>a_a [1]=>AA)
[1]=>array([0]=>b_b [1]=>BB)
[3]=>array([0]=>c_c [1]=>CC)
)
either output like below:
$result = array(
[0]=>array([0]=>a_a [1]=>aa [2]=>AA)
[1]=>array([0]=>b_b [1]=>bb [2]=>AA)
[3]=>array([0]=>c_c [1]=>cc [2]=>AA)
)
how i do this thing what is the best way any suggestion.
I don;t know which is the best way but you could do this with two loops. Example:
$result = array();
foreach($array1 as $val1) {
foreach($array2 as $val2) {
if($val1[1] == $val2[0]) {
$result[] = array($val1[0], $val1[1], $val2[1]);
}
}
}
echo '<pre>';
print_r($result);
For the first result, its easily modifiable:
$result[] = array($val1[0], $val2[1]);
you can use this function
1st output :
function my_array_merge(&$array1, &$array2) {
$result = array();
foreach($array1 as $key => &$value) {
$result[$key] = array_unique(array_merge($value, $array2[$key]));
}
return $result;
}
$arr = my_array_merge($array1, $array2);
2st output :
function my_array_merge(&$array1, &$array2) {
$result = array();
foreach($array1 as $key => &$value) {
$result[$key] = array_merge(array_diff($value, $array2[$key]), array_diff($array2[$key],$value));
}
return $result;
}