I would like to save my count result when ElasticSearch return this line:
{"took":13,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":2242,"max_score":1.0,"hits":[{"_index":"
I wish to save the total result into a variable, but I don't found the good regex rule to save "2242".
Why do you think you need a regex? Just use json_decode and access it like this; closed your JSON for this example:
$raw_json = '{"took":13,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":2242,"max_score":1.0,"hits":[{"_index":"999999"}]}}';
$decoded_json = json_decode($raw_json);
echo '<pre>';
print_r($decoded_json);
echo '</pre>';
The output would be this:
stdClass Object
(
[took] => 13
[timed_out] =>
[_shards] => stdClass Object
(
[total] => 5
[successful] => 5
[failed] => 0
)
[hits] => stdClass Object
(
[total] => 2242
[max_score] => 1
[hits] => Array
(
[0] => stdClass Object
(
[_index] => 999999
)
)
)
)
Then knowing that you just access the total under hits like this:
$hits_total = $decoded_json->hits->total;
echo $hits_total;
Or if objects are not easy for you to parse, just set json_decode to return an array by setting the second parameter to true.
$decoded_json = json_decode($raw_json, true);
And then access it like this:
$hits_total = $decoded_json['hits']['total'];
echo $hits_total;
You could use the count API facility in ElasticSearch to reduce data size for parsing.
But anyway you should use json_decode to parse returned results.
Related
Having real issues with this. I want to be able to get a value from this data which is returned via an API.
ie get value by
$CM_user_customfields['Organisation'],
$CM_user_customfields->Organisation.
is that even possible? I have tried loops and rebuilding the array but i always end up with a similar results and perhaps overthinking it.
I can't use the [int] => as the number of custom fields will be changing a lot.
$CM_user_customfields = $CM_details->response->CustomFields ;
echo '<pre>' . print_r( $CM_user_customfields, true ) . '</pre>';
// returns
Array
(
[0] => stdClass Object
(
[Key] => Job Title
[Value] => Designer / developer
)
[1] => stdClass Object
(
[Key] => Organisation
[Value] => Jynk
)
[2] => stdClass Object
(
[Key] => liasoncontact
[Value] => Yes
)
[3] => stdClass Object
...
many thanks, D.
I recommend convert to associative array first:
foreach($CM_user_customfields as $e) {
$arr[$e->Key] = $e->Value;
}
Now you can access it as:
echo $arr['Organisation'];
You can also achieve it by: (PHP 7 can convert stdClass and will do the trick)
$arr = array_combine(array_column($CM_user_customfields, "Key"), array_column($CM_user_customfields, "Value")));
I have this code :
<?php
$array = array ( array ('pcs'=>'23', 'kg'=>'3'),
array ('pcs'=>'24', 'kg'=>'4'),
array ('pcs'=>'25', 'kg'=>'5'));
echo '<pre>';
print_r($array);
$array = json_encode($array);
echo $array;
$array = json_decode($array);
echo '<pre>';
print_r($array);
?>
and here's the output :
Array
(
[0] => Array
(
[pcs] => 23
[kg] => 3
)
[1] => Array
(
[pcs] => 24
[kg] => 4
)
[2] => Array
(
[pcs] => 25
[kg] => 5
)
)
[{"pcs":"23","kg":"3"},{"pcs":"24","kg":"4"},{"pcs":"25","kg":"5"}]
Array
(
[0] => stdClass Object
(
[pcs] => 23
[kg] => 3
)
[1] => stdClass Object
(
[pcs] => 24
[kg] => 4
)
[2] => stdClass Object
(
[pcs] => 25
[kg] => 5
)
)
why my array becomes stdClass Object? can I still manipulates stdClass Object just like an array?
UPDATE : I got this error when I tried to echo-ing $array[0]['pcs'] :
Fatal error: Cannot use object of type stdClass as array in /home/*** on line **
The "problem" has nothing in common with json_encode, but rather with json_decode.
This will return an array:
$array = json_decode($array, true);
From the PHP Manual:
json_decode() is use to Decodes a JSON string:
When you use second param as TRUE in json_decode():
Returned objects will be converted into associative arrays.
Solution for you:
$array = json_decode($array,TRUE); // use second param as TRUE in your code.
Some Basic Examples for Understanding:
Example 1:
<?php
$json = '{"test":"test","test2":"test2"}'; // json string
echo "<pre>";
print_r(json_decode($json)); // without using second param
?>
Result (return as object):
stdClass Object
(
[test] => test
[test2] => test2
)
Example 2:
<?php
$json = '{"test":"test","test2":"test2"}';
echo "<pre>";
print_r(json_decode($json,TRUE)); // with second param true
?>
Result:
Array
(
[test] => test
[test2] => test2
)
That's standard php behavior. json_decode() will convert incoming data to an array of objects of class stdClass.
You can still access all elements but you have to do it more OOP:
echo $array[0]->pcs;
echo $array[0]->kg;
If you want json_decode() to reproduce your initial array use second option of the function:
$array = json_decode($array, true);
echo $array[0]['pcs'];
echo $array[0]['kg'];
Is this Normal?
Yes, because json_decode basically returns an object and since you didn't specify the second parameter it should return an object and not an array.
According to docs
When TRUE, returned objects will be converted into associative arrays.
so to make it return an array, is to make the second parameter equal to true.
$array = json_decode($array,true);
I have JSON like this (from nested sorting)
[
{"id":13},{"id":14},
{"id":15,
"children":[
{"id":16},{"id":17},{"id":18}
]
},
{"id":19},{"id":20},
{"id":21,
"children":[
{"id":22}
]
}
]
how I PHP loop to put this JSON in MySQL
Thank you.
As with any valid JSON format string, you can use PHP's built-in json_decode to convert it into a parsable object and then loop through those parameters. In this case, from the JSON string you've given (which seems to be an array)
$array = json_decode($string);
foreach ($array as $val) {
//The object $val will be:
"id":13
}
If it's nested, you would do another foreach loop and detect for the property that needs to be looped. For example you could do this in a variety of ways (check for the "children" property, loop through the $val properties and check if it is an array, if it is then loop through that). Inside this foreach loop iteration, you can insert it, or do execute whatever statement you need to get it inside MySQL
Your question is pretty vague on the format and way you want it inserted. I'd suggest showing some code you've tried so other people can help you and know what direction you're going in. (that's probably the reason for the downvote, not mine by the way)
Looping through all the properties of object php
just put your valid json inside json_decode and assign it to a php array as below
//$php_arr = json_decode('YOUR_JSON');
$php_arr = json_decode('[{"id":13},{"id":14},{"id":15,"children":[{"id":16},{"id":17},{"id":18}]},{"id":19},{"id":20},{"id":21,"children":[{"id":22}]}]');
/*comment the following 3 lines when done*/
echo "<pre>";
print_r($php_arr);
echo "</pre>";
/*comment the above 3 lines when done*/
output
Array
(
[0] => stdClass Object
(
[id] => 13
)
[1] => stdClass Object
(
[id] => 14
)
[2] => stdClass Object
(
[id] => 15
[children] => Array
(
[0] => stdClass Object
(
[id] => 16
)
[1] => stdClass Object
(
[id] => 17
)
[2] => stdClass Object
(
[id] => 18
)
)
)
[3] => stdClass Object
(
[id] => 19
)
[4] => stdClass Object
(
[id] => 20
)
[5] => stdClass Object
(
[id] => 21
[children] => Array
(
[0] => stdClass Object
(
[id] => 22
)
)
)
)
Now as you have PHP array do what ever you want like
foreach($php_arr as $arr){
if(!isset($arr['children'])){
$q = "insert into tbl(id) values('".$arr['id']."')";
}else{
//your logic
}
}
You need to use json_decode function to decode JSON data. Then use foreach loop to manipulate data.
Try example
$str = '
[{"id":13},{"id":14},{"id":15,"children":[{"id":16},{"id":17},{"id":18}]},{"id":19},{"id":20},{"id":21,"children":[{"id":22}]}]
';
$json = json_decode($str);
//var_dump($json);
foreach ($json as $item)
{
//The object $val will be:
echo $item->id."<br />";
//You INSERT query is here
//echo "INSERT INTO table (field) VALUE ($item->id)";
$query = mysqli_query($conn, "INSERT INTO table (field) VALUE ($val->id)");
}
I have a object as shown below and i want to extract data from
stdClass Object
(
[day1] => stdClass Object
(
[0] => 12.06.2015
[part1] => Array
(
[0] => 19.00
[1] => 22.00
)
[part2] => Array
(
[0] =>
[1] =>
)
)
)
How will i get date as shown above with key 0. I can get others as
$string->day1->part1[0]
How can i get date "12.06.2015" ? This seems to be complicated.
JSON string for reference
{"day1":{"0":"12.06.2015","part1":["19.00","22.00"],"part2":["",""]},"day2":{"0":"13.06.2015","part1":["09.00","12.00"],"part2":["13.00","17.00"]}}
used json_decode to decode it.
You can use this:
echo $string->day1->{0};
Or my preference, decode as an array with the second argument set to true in json_decode() to use this:
echo $string['day1'][0];
I got this part in an object:
[tcd_old_value] => {"14":{"name":"Nakon radnog vremena","name_changed":false,"added_cc":[],"removed_cc":["4"]},"15":{"name":"Dodatno radno vrijeme","name_changed":false,"added_cc":[],"removed_cc":["4"]}}
after json_decode
$json_object = json_decode(tcd_old_value);
I get:
stdClass Object
(
[14] => stdClass Object
(
[name] => Nakon radnog vremena
[name_changed] =>
[added_cc] => Array
(
)
[removed_cc] => Array
(
[0] => 4
)
)
[15] => stdClass Object
(
[name] => Dodatno radno vrijeme
[name_changed] =>
[added_cc] => Array
(
)
[removed_cc] => Array
(
[0] => 4
)
)
)
I'm trying to count how many indexes are in this object (obviously the result should be 2)
$result = count($json_object);
echo $result //returns 1
Any insight on what I'm doing wrong here?
You cannot use count() in this case, because you have an object and not an array.
You may use the second parameter of json_decode() to have the JSON converted to an associative array:
$json_object = json_decode(tcd_old_value, true);
$result = count($json_object);
echo $result; // Now prints 2
Keep in mind that $json_object is no longer an object, but an array instead.
As per the document count
Returns the number of elements in array_or_countable. If the parameter
is not an array or not an object with implemented Countable interface,
1 will be returned. There is one exception, if array_or_countable is
NULL, 0 will be returned.
You may need to use
json_decode('json', true);
to convert as an array