parse into another array contain xml child node using php - javascript

currently, im having problem to parse xml node in array using condition where parse with <mo> as separator
this is my array(0)
Array([0] => <mi>x</mi><mo>+</mo><mn>2</mn><mo>=</mo><mn>3</mn>);
i want to parse like this
Array[0] => <mi>x</mi>
Array[1] =><mo>+</mo><mn>2</mn>
Array[2]=><mo>=</mo><mn>3</mn>
this is my coding
<?
$result(0)="<mi>x</mi><mo>+</mo><mn>2</mn><mo>=</mo><mn>3</mn>";
$result1= new simplexml_load_string($result);
$arr_result=[];
foreach($result1 as $key => $value){
$exp_key = explode('<', $key);
if($key[0] == 'mo'){
$arr_result[] = $value;
}
print_r($arr_result);
}
if(isset($arr_result)){
print_r($arr_result);
}
?>
thanks in advance !

The approach with XML seems excessive since what you really want is to pull out substrings of a string based on a delimiter.
Here is a working example. It works by finding the position of <mo> and cutting off that section, then searching for the next <mo> in the remain string.
<?php
$result(0)="<mi>x</mi><mo>+</mo><mn>2</mn><mo>=</mo><mn>3</mn>";
$res = $result(0);
$arr_result=[];
while($pos = strpos($res, "<mo>", 1)) {
$arr_result[] = substr($res, 0, $pos); // grab first match
$res = substr($res, $pos); // grab the remaining string
}
$arr_result[] = $res; // add last chunk of string
print_r($arr_result);
?>
Your code above has several issues.
First:
$result1= new simplexml_load_string($result); // simplexml_load_string() is a function not a class
Second:
$key and $value do not contain the '<' and '>' so, this part:
$exp_key = explode('<', $key); will never do anything and isn't needed.
Third:
If your code did work it would only return array('+', '=') because you are appending the data inside the mo element to the result array.

Related

Display JSON datas in column with PHP then return selection in the same format

I am currently working on a ticket reservation script (With date, time of reservation then quantity available).
I am trying to communicate with an API which is supposed to send me the data from the db in JSON format so that I can interpret it and display in PHP in a column in which I should display the day in the header of the column, the hour in each cells and a default quantity ( In my example we start from 60/60 which will be decremented by 1 when selecting the user.
For the moment, I'm just trying to manage to automatically create a column for each date, with the values ​​to select and the value of the remaining quantity (Knowing that a selection decrements by 1) then return the result in JSON format to the API to update the database and save the selection by assigning the user's IP to it.
I started a small script which retrieves the elements of the database in JSON format for the example, I think I have to create a foreach loop to create my columns but I'm stuck at the moment. Thank you for the leads or any help you think that you could bring me.
here's a picture of what i am trying to do:
enter image description here
<?php
try{
$pdo=new PDO(
'mysql:host=localhost;dbname=date_booking',
'root','',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
} catch(PDOException $e){
echo $e->getMessage();
}
$statement=$pdo->prepare("SELECT * FROM tbl_booking");
$statement->execute();
$datas = array();
while($res=$statement->fetch(PDO::FETCH_ASSOC)) {
$datas[]=$res;
}
$someArray = $datas; // Replace ... with your PHP Array
foreach ($someArray as $key => $value) {
echo '<pre>';
echo $value["date_booking"]. ' | ' . $value["hour_booking"]. ' | ' . $value["nb_booking"];
echo '</pre>';
}
Start by selecting ONLY what you want from the table, then you can simply use fetchAll() to return the complete resultset as an array of arrays or objects, I used Objects in the below example.
It is then simple to make that into a JSON String to return to the caller using json_encode()
<?php
try{
$pdo=new PDO(
'mysql:host=localhost;dbname=date_booking',
'root','',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
} catch(PDOException $e){
echo $e->getMessage();
}
$statement=$pdo->prepare("SELECT date_booking, hour_booking, nb_booking
FROM tbl_booking");
$statement->execute();
$rows = $statement->fetchAll(PDO::FETCH_OBJ);
echo json_encode($rows);
Then in you javascript you have an array of objects that you can place into your page however you want.

echo statement not working? Seems to be formatted correctly

I'm creating a object in javascript echo'd by PHP, the syntax seems to be correct but it is giving me an error.
The variables I am passing to the object are strings and I have tried putting them in quotes, etc. I also tried creating a JS function to do this and it had similar results.
<?PHP
$TEDS = $db->query("
SELECT a.*
FROM TEDS a
");
//Add each TED location into a javascript array.
echo '<script type="text/javascript">';
while($TED = $TEDS->fetch_assoc())
{
echo 'var pos = {lat: '.$TED['latitude'].', lng: '.$TED['longitude'].'};'; //THIS ECHO STATEMENT IS THE ONE GIVING ME PROBLEMS.
}
echo '</script>';
?>
It's highly likely that one of your latitude values does not have a value, causing it to print something like the following:
var pos = {lat: , lng: 1234}
Without a value to go with the property, the JavaScript parser would unexpectedly see the comma. This would greatly explain an unexpected comma syntax error.
So, first of all, you do NOT manually construct JSON. PHP has json_encode() that converts PHP arrays into JSON. Use that to correctly build JSON for you.
Next, your code prints pos repeatedly, overriding the previous values. If you only care about the last value, don't print everything. If you do care about all the values, store them in an array:
<?php
// Get your TEDS
$teds = $TEDS->fetch_assoc();
// Using array_map to convert the items from latitude-longitude to lat-lng.
$teds_array = array_map(function($ted) {
return ['lat' => $ted['latitude'], 'lng' => $ted['longitude']];
}, $teds);
// Serialize to JSON
$teds_json = json_encode($teds_array);
?>
// positions will be an array of objects with lat-lng.
var positions = <?php echo $teds_json; ?>
Lastly, be careful of XSS. Do not just print unsanitized values like above. Make sure your data is clean before printing it on the page.
i would try to write the full text, after the loop. This way you can build a full json array:
<?PHP
$TEDS = $db->query("
SELECT a.*
FROM TEDS a
");
//Add each TED location into a javascript array.
echo '<script type="text/javascript">';
$text = 'var positions = [';
while($TED = $TEDS->fetch_assoc()) {
$text .= '{lat: '.$TED['latitude'].', lng: '.$TED['longitude'].'},';
}
// remove last comma
$text = substr($text,0 , strlen($text)-2);
$text .= '];'
echo $text;
echo '</script>';
?>
Another way would be to just json_decode($TED).

reading a specific dat from a text file

I am new to php. I am trying extract a particular value from a joke file using file_get_content( text.txt, NULL,NULL, 200, 4) but it returns the values after the 200th character. please is there a better way to do this. like instead of specifying the position which may vary i specify a word rather
Perhaps this solution might be what you are looking for?
<?php
$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);
if ($pos === false) {
echo "Not found";
} else {
echo "The string '$findme' was found in the string '$mystring'";
echo " and exists at position $pos";
}
?>

Datetime format in PHP with MongoDB

I'm getting problems while filtering data from a MongoDB where documents have a "iso_date" field like
ISODate("2010-08-01T00:00:00Z")
in the following .php file,
<?php
$date_a = $_GET['date_a'];
$date_b = $_GET['date_b'];
$m = new MongoClient('mongodb://127.0.0.1:xxxxx');
$db = $m->db;
$collection = $db->collection;
$res = $collection->find(array(
'iso_date' => array('$gte' => $date_a, '$lte' => $date_b)
));
$m->close();
echo json_encode($res);
?>
where date_a and date_b are created in javascript. I've tried to add string "T00:00:00Z" to YYYY-MM-DD dates, but the result is always empty (and I'm sure it shouldn't be).
How can I solve this? I'd like not to convert everything to strings, and to keep a datetime format.
Try this :
$collection = $db->collection;
$start = $_GET['date_a'];
$end = $_GET['date_a'];
// find dates between 1/15/2010 and 1/30/2010
$collection->find(array("iso_date" => array('$gt' => $start, '$lte' => $end)));
Your $date_a and $date_b need to be instances of MongoDate (since you're using legacy driver chridam's answer may not work).

Chunking MySQL array with json encode

I know there are existing some Questions about Chunking a mysql array in php, but my problem is, that I want to keep the output in JSON.
Scenario:
I want to get data from mysql, do some stuff with it ( like time formatting ) and output it in JSON.
The JSON data is parsed in the browser and visualized over a javascript chart.
Problem:
All of the above is working, but because of the huge amount of data, I'm getting an out of memory error, when I select bigger date ranges to output.
The Idea of directly sending out each x-lines of data is not working because of the JSON format it needs to be. Several JSON chunks won't work, it needs to be one for the chart.
So in the end I need to chunk the data but keep it as one big JSON.
(And setting up the memory limit is not really a solution.)
Ideas:
One Idea would be, to let the browser chunk the date range and ask the data as chunks & then put them together.
Of course this would work, but if there is a way to do this server side, it would be better.
Code:
private function getDB($date1, $date2){
$query = 'SELECT * FROM `db1`.`'.$table.'` WHERE `date` BETWEEN "'.$date1.'" AND "'.$date2.'" order by `date`;';
// date = datetime !
$result = $this->db->query($query);
$array = array();
while ( $row = $result->fetch_assoc () ) {
$array[] = array( strtotime($row[ 'date' ])*1000 , (float)$row[ 'var' ] );
// the formatting needs to be done, so the chart accepts it..
}
$result->close();
return json_encode($array);
}
Since this is not an option,
ini_set("memory_limit","32M")
perhaps you can add LIMIT to the function paramaters and query:
private function getDB($date1, $date2, $start, $pageSize){
$query = 'SELECT * FROM `db1`.`'.$table.'` WHERE `date` BETWEEN "'.$date1.'" AND "'.$date2.'" order by `date` LIMIT $start, $pageSize;';
// date = datetime !
$result = $this->db->query($query);
$array = array();
while ( $row = $result->fetch_assoc () ) {
$array[] = array( strtotime($row[ 'date' ])*1000 , (float)$row[ 'var' ] );
// the formatting needs to be done, so the chart accepts it..
}
$result->close();
return json_encode($array);
}
Then setup a for loop in javascript, call this with Ajax, incrementing the $start variable each time.
Store each responseText.substr(1).substr(-1) in an array.
When the responseText is "", all of the records have been returned.
.join the array with a comma, then add a new opening and closing "{ }", and you should have a JSON equivalent to all records.
Minimal parsing, and you'll be using built-in functions for most of it.
var startRec=0;
var pageSize=50;
var xmlhttp=new XMLHttpRequest();
var aryJSON=[];
var JSON;
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
if(xmlhttp.responseText==""){ //Might need to check for "{}" here instead of ""
//All records are received
JSON="{" + aryJSON.join(",") + "}";
aryJSON=[];
startRec=0
}else{
aryJSON.push(xmlhttp.responseText.substr(1).substr(-1));
startRec+=pageSize;
getNextPage();
}
}
}
function getNextPage(){
xmlhttp.open("GET","your.php?start=" + startRec + "&pageSize=" + pageSize,true);
xmlhttp.send();
}
I would recommend that you have the server send the browser exactly what it needs to create the table. Parsing can be a heavy task, so why have the client do that lifting?
I would have your backend send the browser some kind of data structure that represents the table (i.e. list of lists), with all the formatting already done. Rendering the table should be faster and less memory-intensive.
One way of answer would be, to do the chunking on the server, by giving out the JSON, removing the leading [ & ].
#apache_setenv('no-gzip', 1);
#ini_set('zlib.output_compression', 0);
#ini_set('implicit_flush', 1);
$array = array();
echo '[';
$started = false;
while ( $row = $result->fetch_assoc () ) {
$array[] = [ strtotime($row[ 'datetime' ])*1000 , (float)$row[ 'var' ] ];
if(sizeof($array) == 1000){
if($started){
echo ',';
}else{
$started = true;
}
echo substr(substr(json_encode($array),1), 0, -1);
// converting [[datetime1, value1],[datetime2, value2]]
// to [datetime1, value1],[datetime2, value2]
ob_flush();
$array = array();
}
}
if($started)echo ',';
$this->flushJSON($array);
echo ']';
flush();
$result->close();
This is working and reducing the ram usage to 40%.
Still it seems that Apache is buffering something, so the ram usage increases over the time, the script is running. (Yeah, the flush is working, I debugged that, that's not the problem.)
But because of the remaining increase, the fastest way to achieve a clean chunking is to do this like alfadog67 pointed it out.
Also, to mention it, I had to disable the output compression, otherwise apache wouldn't flush it directly..

Categories