tokenize — взрывать строку только внешним разделителем в переполнении стека

У меня есть источник, откуда я получаю пары широт и долгот, где они разделены запятой и заключены в скобки, а сами пары также разделены запятыми. Я хочу получить каждую пару и сохранить в таблице

введите описание изображения здесь

Пытался:

$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] */

Так как я могу получить желаемый результат или есть какой-то лучший способ?

0

Решение

Может быть

$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)
)
3

Другие решения

Не могли бы вы использовать регулярные выражения?
Я думаю, вы могли бы попробовать это:

<?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;
}
2

$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*)\)/ шаблон для захвата отрицательных или положительных пар широты и долготы

1

Вы можете использовать это

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)"

будет получен, как и ожидалось, но использование простого взрыва может привести к неуместным результатам

1
По вопросам рекламы [email protected]