Должен ли я использовать взорвать, разделить и / или обрезать; и как? - PullRequest
2 голосов
/ 21 декабря 2011

Я хотел бы получить некоторые значения из этого:

$bounds = '((-34.41859810454894, 150.5594567718506), (-34.375112955999064, 150.74124617004395))';

Моя цель - перечислить каждое из четырех чисел в качестве своей переменной:

$swla = -34.41859810454894;
$swlo = 150.5594567718506;
$nela = -34.375112955999064;
$nelo = 150.74124617004395;

Вот мойДрянная попытка взлома:

$pieces = explode("),", $bounds);
var_dump($pieces); //array(2) { [0]=> string(39) "((-34.41859810454894, 150.5594567718506" [1]=> string(43) " (-34.375112955999064, 150.74124617004395))" } 
echo '<br />';

$sw = trim(substr($pieces[0], 2));
echo $sw .'<br />'; //-34.41859810454894, 150.5594567718506
$ne = trim(substr($pieces[1], 2), " ) ");
echo $ne.'<br />'; //-34.375112955999064, 150.74124617004395

$sw = explode(",", $sw);
var_dump($sw); //array(2) { [0]=> string(18) "-34.41859810454894" [1]=> string(18) " 150.5594567718506" } 
echo '<br />';
$ne = explode(",", $ne); //array(2) { [0]=> string(19) "-34.375112955999064" [1]=> string(19) " 150.74124617004395" } 
var_dump($ne);
echo '<br />';

Спасибо

Ответы [ 5 ]

5 голосов
/ 21 декабря 2011

Самый короткий метод, вероятно, preg_match_all:

preg_match_all('/[0-9.-]+/', $bounds, $matches);
list($swla, $swlo, $nela, $nelo) = $matches[0];

Если вы хотите плавать, вы можете использовать sscanf. Однако эти числа слишком точны, чтобы их можно было корректно использовать в двойниках PHP, поэтому при этом вы потеряете некоторую точность.

2 голосов
/ 21 декабря 2011

Просто чтобы показать, что вы можете использовать sscanf ()

$bounds = '((-34.41859810454894, 150.5594567718506), (-34.375112955999064, 150.74124617004395))';

sscanf($bounds,'((%[-0-9.], %[-0-9.]), (%[-0-9.], %[-0-9.]))',$swla,$swlo,$nela,$nelo);

echo $swla,PHP_EOL;
echo $swlo,PHP_EOL;
echo $nela,PHP_EOL;
echo $nelo,PHP_EOL;

дает

-34.41859810454894 
150.5594567718506 
-34.375112955999064 
150.74124617004395
2 голосов
/ 21 декабря 2011

Вы можете использовать sscanf():

sscanf($bounds, "((%f, %f), (%f, %f))", $swla, $swlo, $nela, $nelo);

Это преобразует ваши координаты в floats. Вы можете узнать больше о форматах здесь .

0 голосов
/ 21 декабря 2011

Мне нравится версия preg_match, но в зависимости от вашего использования вы, безусловно, можете использовать explode для загрузки их в массивы.

 $bounds = '((-34.41859810454894, 150.5594567718506), (-34.375112955999064, 150.74124617004395))';
 $tempArray = explode(',', $bounds); 

 //Gives you $tempArray[0] = ((-34.41859810454894
 //and $tempArray[1] =  150.5594567718506)
 //and $tempArray[2] = (-34.375112955999064
 //and $tempArray[3] =  150.74124617004395))

 $latLongArray = array();
 foreach($tempArray as $latLong)
 {
     $tempValue = str_replace('(', '', $tempValue);
     $tempValue = str_replace(')', '', $tempValue);
     $latLongArray[] = trim($tempValue);
 }

Затем вы можете либо вытолкнуть массив LatLong в ассоциативный массив с именами ваших переменных / и т.д. На самом деле все зависит от того, хотите ли вы использовать регулярные выражения или от того, насколько сильно шаблонизированы ваши входные данные.

0 голосов
/ 21 декабря 2011

Лично я бы сделал это: -

$bounds = '((-34.41859810454894, 150.5594567718506), (-34.375112955999064, 150.74124617004395))';
$bounds = str_ireplace(array('(', ')'), '', $bounds);
$bounds = explode(',', $bounds);
foreach($bounds as $key => $bound){
    $bounds[$key] = floatval($bound);
}
var_dump($bounds);

Выход: -

массив
0 => float -34.418598104549
1 => плавать 150,55945677185
2 => float -34.375112955999
3 => float 150.74124617004

Я не знаю, сколько точности вам нужно, но этот метод немного теряет.

...