Maybe someone can help me get coordinates from text to array?
I'm trying use preg_match but no success.
I can remove geometry":{"paths":[[[**" and **]]}}]})
then use some times 'explode' and get coo, but I don't like this idea
Coordinates:
"geometry":{"paths":
[[[485749.91999999998,6108180.6500000004],
[485722.35999999999,6108206],
[485691.14000000001,6108234.3099999996],
[485400.84999999998,6108513.1500000004],
[485368.60999999999,6108545.46],
[485301.53999999998,6108613.1900000004],
[484054.82000000001,6109868.9100000001],
[484051.17566666665,6109872.6840000004]]]}}]});
To figure out my approach in the comment above. Convert the string to valid JSON. Afterwards you can decode the string using json_decode():
$jsonArr = json_decode('{' . substr($string, 0, -4), true);
$coordinates= $jsonArr['geometry']['paths'][0]);
var_dump($coordinates):
So you end up with an array of coordinate pairs:
array(8) {
[0]=>
array(2) {
[0]=>
float(485749.92)
[1]=>
float(6108180.65)
}
[1]=>
array(2) {
[0]=>
float(485722.36)
[1]=>
int(6108206)
}
[2]=>
array(2) {
[0]=>
float(485691.14)
[1]=>
float(6108234.31)
}
[3]=>
array(2) {
[0]=>
float(485400.85)
[1]=>
float(6108513.15)
}
[4]=>
array(2) {
[0]=>
float(485368.61)
[1]=>
float(6108545.46)
}
[5]=>
array(2) {
[0]=>
float(485301.54)
[1]=>
float(6108613.19)
}
[6]=>
array(2) {
[0]=>
float(484054.82)
[1]=>
float(6109868.91)
}
[7]=>
array(2) {
[0]=>
float(484051.175667)
[1]=>
float(6109872.684)
}
}
This is invalid Javascript object notation. Running it through JSONLint shows that it has an invalid array length. You might want to provide more context for your question.
Assuming you have something similar to the above but with valid JSON, you can use the json_decode method to convert a valid JSON string into PHP arrays and objects.
Related
I have some float values being looped through an array that are outputting in scientific notation.
I need to convert the scientific notation to a regular flat float long notation value.
I tried number_format(), but it still outputs in scientific notation until the very last cycle of my loop?
<?php
$parray = array(array('BTC-EXP','1',0.000097,1),array('BTC-VOX',7,number_format(0.000075,8),7));
for ($x = 0; $x <= 1; $x++) {
var_dump($parray);
foreach($parray as $pairp){
echo "\nDebug info! Limit\n";
echo $pairp[2];
echo "\n";
print_r(number_format($pairp[2],8));
}
}
?>
output:
Debug info! midpoint
array(2) {
[0]=>
array(4) {
[0]=>
string(7) "BTC-EXP"
[1]=>
string(1) "1"
[2]=>
float(9.7E-5)
[3]=>
int(1)
}
[1]=>
array(4) {
[0]=>
string(7) "BTC-VOX"
[1]=>
int(7)
[2]=>
string(10) "0.00007500"
[3]=>
int(7)
}
}
Debug info! Limit
9.7E-5
0.00009700
Debug info! Limit
0.00007500
0.00007500
Debug info! midpoint
array(2) {
[0]=>
array(4) {
[0]=>
string(7) "BTC-EXP"
[1]=>
string(1) "1"
[2]=>
float(9.7E-5)
[3]=>
int(1)
}
[1]=>
array(4) {
[0]=>
string(7) "BTC-VOX"
[1]=>
int(7)
[2]=>
string(10) "0.00007500"
[3]=>
int(7)
}
}
Debug info! Limit
9.7E-5
0.00009700
Debug info! Limit
0.00007500
0.00007500
How do I convert my float values to long notation through an entire cycle (deny short notation)?
In your $parray, you are storing one number as a float (0.000097) and in the other you're storing the result of number_format(0.000075,8), which is a string.
It's not surprising then, that when you call
echo $pairp[2]; on 0.000097, that you see 9.7E-5, but when you echo it for number_format(0.000075,8) you see a string representation (0.00007500).
Let's do the same for print_r(number_format($pairp[2],8));. When it's called for float (0.000097), it formats it as a string and you see 0.00009700. When it's called for "0.00007500", this string is converted to a float 0.000075, which is then converted back to a string "0.00007500".
im reading in some data and want to sort it into an array.
To be more specific, im reading in an obj model and i want to sort all edges into an array. Each edge element then should exist of an array of all faces which use this edge. So after sorting, each edge should have 2 entries existing of the two faces which use them. But after the actual sorting most edges occur twice with the same key and a single face as an entry. Here in some more details what i mean :
First Face i read in is
array(4) {
[0]=>
string(1) "f"
[1]=>
string(1) "1"
[2]=>
string(1) "2"
[3]=>
string(2) "3
which sorts the edges 1_2 , 2_3 and 1_3 into this array (value is the face which uses this edge, face number 0 )
array(3) {
["1_2"]=>
array(1) {
[0]=>
int(0)
}
["2_3"]=>
array(1) {
[0]=>
int(0)
}
["1_3"]=>
array(1) {
[0]=>
int(0)
}
When the second face is read
array(4) {
[0]=>
string(1) "f"
[1]=>
string(1) "1"
[2]=>
string(1) "3"
[3]=>
string(2) "4"
the resulting edge array looks like this :
array(6) {
["1_2"]=>
array(1) {
[0]=>
int(0)
}
["2_3"]=>
array(1) {
[0]=>
int(0)
}
["1_3"]=>
array(1) {
[0]=>
int(0)
}
["1_3"]=>
array(1) {
[0]=>
int(1)
}
["3_4"]=>
array(1) {
[0]=>
int(1)
}
["1_4"]=>
array(1) {
[0]=>
int(1)
}
}
the edge 1_3 is used by both faces, but how the heck does the key "1_3" appear twice in a single array with different values?! i expected it to look like this
["1_3"]=>
array(2) {
[0]=>
int(0)
[0]=>
int(1)
}
i do not have a clue why or how this happens, because as far as i know keys should be unique. when giving out the element "1_3" i then only recieve the latest entry ( int(1) ).
full sorting code looks like this
if ($line_temp[0]=="f"){
for ($j=0;$j<3;$j++){
$line_temp2 = explode("//",$line_temp[$j+1]);
$data["f"][$face_number][$j] = $line_temp2[0];
}
if ($data["f"][$face_number][0]<$data["f"][$face_number][1]){
$data["e"][$data["f"][$face_number][0]."_".$data["f"][$face_number][1]][]=$face_number;
} else {
$data["e"][$data["f"][$face_number][1]."_".$data["f"][$face_number][0]][]=$face_number;
}
if ($data["f"][$face_number][1]<$data["f"][$face_number][2]){
$data["e"][$data["f"][$face_number][1]."_".$data["f"][$face_number][2]][]=$face_number;
} else {
$data["e"][$data["f"][$face_number][2]."_".$data["f"][$face_number][1]][]=$face_number;
}
if ($data["f"][$face_number][0]<$data["f"][$face_number][2]){
$data["e"][$data["f"][$face_number][0]."_".$data["f"][$face_number][2]][]=$face_number;
} else {
$data["e"][$data["f"][$face_number][2]."_".$data["f"][$face_number][0]][]=$face_number;
}
var_dump($data["e"]);
var_dump($data["e"]["1_3"]);
$face_number++;
}
By doing ajax I am getting one result in php like this
source_lang_pair[]=EN-NO&source_lang_pair[]=NE-NO&source_lang_pair[]=HI-NO&source_lang_pair[]=OR-NO&source_lang_pair[]=JA-NO&resource_search_name=aa
I want to extract all the values of source_lang_pair and resource_search_name value together.
I have tried parse_str but its not working. So can someone tell me how to extract those values from the string?
parse_str works great like this:
<?php
$str = "source_lang_pair[]=EN-NO&source_lang_pair[]=NE-NO&source_lang_pair[]=HI-NO&source_lang_pair[]=OR-NO&source_lang_pair[]=JA-NO&resource_search_name=aa";
parse_str($str);
echo $resource_search_name;
echo "<br/>";
var_dump ($source_lang_pair);
Output:
aa
array(5) {
[0]=>
string(5) "EN-NO"
[1]=>
string(5) "NE-NO"
[2]=>
string(5) "HI-NO"
[3]=>
string(5) "OR-NO"
[4]=>
string(5) "JA-NO"
}
or you can use like this for uncertainty:
<?php
$str = "source_lang_pair[]=EN-NO&source_lang_pair[]=NE-NO&source_lang_pair[]=HI-NO&source_lang_pair[]=OR-NO&source_lang_pair[]=JA-NO&resource_search_name=aa";
parse_str($str, $output_array);
var_dump ($output_array);
This time your output will be:
array(2) {
["source_lang_pair"]=>
array(5) {
[0]=>
string(5) "EN-NO"
[1]=>
string(5) "NE-NO"
[2]=>
string(5) "HI-NO"
[3]=>
string(5) "OR-NO"
[4]=>
string(5) "JA-NO"
}
["resource_search_name"]=>
string(2) "aa"
}
Help to understand how works PHP's unpack.
I know that in ruby I can use unpack somehow:
"abcdefgh-abcdefgh-abcdefgh-abcdefgh".unpack("NnnnnN")
=> [1633837924, 25958, 26472, 11617, 25187, 1684366951]
Given the documentation in PHP too. But actually it does not really work.
I need array of 6 elements. Lets try to get it...
$bytes = openssl_random_pseudo_bytes(16);
var_dump(unpack("NnnnnN", $bytes));
array(1) {
["nnnnN"]=>
int(2679895791)
}
var_dump(unpack("N/n/n/n/n/N", $bytes));
array(1) {
[1]=>
int(600384068)
}
var_dump(unpack("N1/n1/n1/n1/n1/N1", $bytes));
array(1) {
[1]=>
int(600384068)
}
var_dump(unpack("N1n1n1n1n1N", $bytes));
array(1) { ["n1n1n1n1N"]=> int(2679895791) }
I found workaround:
var_dump(array_values(unpack("N1a/n1b/n1c/n1d/n1e/N1f", $bytes)));
array(6) {
[0]=>
int(2679895791)
[1]=>
int(39295)
[2]=>
int(42804)
[3]=>
int(32471)
[4]=>
int(39559)
[5]=>
int(600384068)
}
But I think there is a bit of black magic. Prompt please how correctly to use the unpack function without aliases (like N1a) and array_values?
No. Each format is evaluated by itself and overwrites the previous values:
var_dump(unpack("N", $bytes));
array(1) {
[1]=>
int(824184250)
}
var_dump(unpack("N/n", $bytes));
array(1) {
[1]=>
int(32979)
}
var_dump(unpack("N/n2", $bytes));
array(2) {
[1]=>
int(32979)
[2]=>
int(48930)
}
It's actually on the documentation you linked:
Caution
Be aware that if you do not name an element, an empty string is used. If you do not name more than one element, this means that some data is overwritten as the keys are the same [...]
I var_dumped two arrays, the top on is the array coming in, $new_array, while the other one is a preexisting array $current_array:
// New Array
array(3) {
["Contributor"]=>
array(2) {
[0]=>
string(13) "edit_carousel"
[1]=>
string(13) "read_carousel"
}
["Editor"]=>
array(1) {
[0]=>
string(16) "delete_mini_feed"
}
["Author"]=>
array(3) {
[0]=>
string(11) "edit_blocks"
[1]=>
string(12) "edit_blockss"
[2]=>
string(12) "edit_blockss"
}
}
// Preexisting
array(3) {
["Contributor"]=>
array(2) {
[0]=>
string(13) "edit_carousel"
[1]=>
string(13) "read_carousel"
}
["Editor"]=>
array(4) {
[0]=>
string(16) "delete_mini_feed"
[1]=>
string(15) "edit_mini_feeds"
[2]=>
string(23) "edit_private_mini_feeds"
[3]=>
string(15) "edit_mini_feeds"
}
["Author"]=>
array(3) {
[0]=>
string(11) "edit_blocks"
[1]=>
string(12) "edit_blockss"
[2]=>
string(12) "edit_blockss"
}
}
I am trying to do something like: var_dump(array_intersect_assoc($current_array, $new_array)); to see whats different in the current array as opposed to the new array and generate an array of "differences" keeping the structure intact.
The issue is:
Is the order of arrays to be compared right? compare old to new and get an array of whats different in old. or should it be compare new to old?
Doing this, results in: Array to string conversion notice, but also prints out an array which is below.
I cant tell if these are: "these are whats not in old, but in new" or "the are whats not in new but in old" .... (It should say: these are not whats in old but in new).
array(3) {
["Contributor"]=>
array(2) {
[0]=>
string(13) "edit_carousel"
[1]=>
string(13) "read_carousel"
}
["Editor"]=>
array(4) {
[0]=>
string(16) "delete_mini_feed"
[1]=>
string(15) "edit_mini_feeds"
[2]=>
string(23) "edit_private_mini_feeds"
[3]=>
string(15) "edit_mini_feeds"
}
["Author"]=>
array(3) {
[0]=>
string(11) "edit_blocks"
[1]=>
string(12) "edit_blockss"
[2]=>
string(12) "edit_blockss"
}
}
The php function array_intersect_assoc() should return everything in the first array (aka $current_array) that exists in the second array (aka $new_array).
The issue that you are running into is that array_intersect_assoc() doesn't preform the key comparison recursively. It's only comparing the first level of keys (Contributor, Editor and Author).
Here's more information about the recursive issue. PHP Question: how to array_intersect_assoc() recursively
Your problem is that you are trying to perform array_intersect on a multidimensional array, but the function does string comparison of elements, resulting in array to string conversion error.
As you have the same keys in both arrays, the simplest solution is just to foreach through and to compare subsequent arrays(and you rather need array_diff if you want difference between the elements)
foreach($array_1 as $index => $sub_array) {
$sub_array_2 = $array_2[$index];
$diff = array_diff($sub_array, $sub_array_2);
// do something with diff
}
UPDATE
If You want to get everything that's not in array_1 but in array_2:
$result = [];
# lets find if there's any new elements
$keys_1 = array_keys($array_1);
$keys_2 = array_keys($array_2);
$diff = array_diff($keys_1, $keys_2);
if(!empty($diff)) {
foreach($diff as $key) {
if(isset($array_2[$key])) {
# it's in array_2
$result[$key] = $array_2[$key];
}
}
}
# now get difference between shared elements
$intersection = array_intersect($keys_1, $keys_2);
foreach($intersection as $key) {
$element_1 = $array_1[$key];
$element_2 = $array_2[$key];
$diff = array_diff($element_1, $element_2);
if(sizeof($diff)) {
if(!isset($result[$key]) ||!is_array($result[$key]) ) {
$result[$key] = array($diff);
} else {
$result[$key][] = $diff;
}
}
}