У меня есть источник, откуда я получаю пары широт и долгот, где они разделены запятой и заключены в скобки, а сами пары также разделены запятыми. Я хочу получить каждую пару и сохранить в таблице
Пытался:
$str = "(a,b),(c,d),(e,f),(g,h)"; //a,c,e,g = latitudes b,d,f,h = longitudes
$str = explode(',' , $str);
print_r($str);
Желаемый:
Array
(
[0] => (a,b)
[1] => (c,d)
[2] => (e,f)
[3] => (g,h)
)
Актуально:
Array
(
[0] => (a
[1] => b)
[2] => (c
[3] => d)
[4] => (e
[5] => f)
[6] => (g
[7] => h)
)
Моя идея была, как только я получу желаемый результат, я могу зациклить их и ..
$tmp = trim('(a,b)', '()'); // "a,b"$res = explode(',', $tmp); // ['a','b']
/* store $res[0] and $res[1] */
Так как я могу получить желаемый результат или есть какой-то лучший способ?
Может быть
$str = "(a,b),(c,d),(e,f),(g,h)"; //a,c,e,g = latitudes b,d,f,h = longitudes
$str = str_replace('),', ')|', $str);
$str = explode('|', $str);
print_r($str);
Output:
Array
(
[0] => (a,b)
[1] => (c,d)
[2] => (e,f)
[3] => (g,h)
)
Не могли бы вы использовать регулярные выражения?
Я думаю, вы могли бы попробовать это:
<?php
// https://regex101.com/r/xiO0jy/2
// with latitude and longitude values
// this is just an example:
$values = "(1.4,2.4),(3.33,7.89),(-7.123,9.01),(-4.58,-2.32)";
/*
The expression: \d*\.\d* is for decimal numbers
The expression: \( \) is for the parentheses
The expression: -{0, 1} is for negative values
The expression: (?: ) is to group the matches
*/
$regex = '/(?:\(-{0,1}\d*\.\d*,-{0,1}\d*\.\d*\))/';
preg_match_all($regex, $values, $matches, PREG_SET_ORDER, 0);
foreach($matches as $m) {
echo $m[0] . PHP_EOL;
}
$str = "(a,b),(c,d),(e,f),(g,h)";
preg_match_all('/\(([^(),]),([^(),])\)/', $str, $matches);
print_r($matches[0]);
Array
(
[0] => (a,b)
[1] => (c,d)
[2] => (e,f)
[3] => (g,h)
)
Обновить
использование /\(((-?)\d*.\d*),((-?)\d*.\d*)\)/
шаблон для захвата отрицательных или положительных пар широты и долготы
Вы можете использовать это
function getCoord2($str,$explode=false){
if(!is_string($str)) return [];
$coord=[];
$start=false;
$latAndLong='';
for($i=0,$strlen=strlen($str);$i<$strlen;$i++){
if($str[$i]=='('){
$start=true;
}
if($start){
$latAndLong.=$str[$i];
}
if($start&&$str[$i]==')'){
$start=false;
if($explode){
$coord[]=array_combine(['latitude','longitude'],array_map('trim',explode(',',trim($latAndLong,'()'))));
}else{
$coord[]=$latAndLong;
}
$latAndLong='';
}
}
return $coord;
}
echo '<pre>';
print_r(getCoord2("(a,b),(c,d),(e,f),(g,h)",true));
Этот код распечатать на экран
Array
(
[0] => Array
(
[latitude] => a
[longitude] => b
)
[1] => Array
(
[latitude] => c
[longitude] => d
)
[2] => Array
(
[latitude] => e
[longitude] => f
)
[3] => Array
(
[latitude] => g
[longitude] => h
)
)
print_r (getCoord2 ( «(а, б), (в, г), (д, е), (ж, з)»));
распечатает
Array
(
[0] => (a,b)
[1] => (c,d)
[2] => (e,f)
[3] => (g,h)
)
На результат этой функции не будут влиять пустые символы и пробел
например
строка
"(a, b), (c,
d),(e,f),(g, h)"
будет получен, как и ожидалось, но использование простого взрыва может привести к неуместным результатам