Разделение значения выпадающего списка на две переменные? (PHP / HTML)

#php #html #coordinates

#php #HTML #координаты

Вопрос:

Итак, у меня есть веб-сайт с двумя выпадающими списками HTML — один представляет собой список штатов США, другой — список городов в выбранном штате. На данный момент у меня есть HTML-файл для каждого состояния, и все они имеют параметры, перечисленные как таковые:

 <option value="44.729932, -72.381758">Albany</option>
<option value="44.976728, -73.30257">Alburg</option>
  

Значения представляют собой координаты (широта, долгота) каждого города. Когда я нажимаю «поиск», данные формы отправляются в PHP-скрипт для SimpleGeo (компания, занимающаяся базой данных местоположений — удивительно, кстати) — цель выбора города — предоставить значения для $ lat и $ lon в этой части PHP-скрипта, который отправляется в SimpleGeo для каждого запроса:

 $q = $_GET['q'];
$lat = 44.729932;
$lon = -72.381758;

$args = array('q' => $q, 'num' => 25, 'category' => Restaurant, 'radius' => 25);
$results = $client->getPlaces($lat, $lon, $args);
  

Часть, которая не может измениться, — это «getPlaces ($ lat, $ lon, $ args);» часть, потому что по какой-то причине, когда я заменяю $ lat и $ lon на $ coordinates, а затем заменяю их значения на:

$coordinates = $_GET['city']; ('city' is the name and id of my city/town lists)

Он не рассматривает это как допустимый запрос. Между тем, если вы замените «$ lat, $ lon» числами в качестве координат, он прекрасно поймет.

… Мне просто нужно разделить мои значения либо в самих HTML-файлах, либо в PHP-скрипте, распознав, что «, » означает, что значение широты закончилось, а значение долготы началось. Я не знаю, как это должно быть сделано, я просто знаю, что $ lat и $ lon должны равняться значениям, установленным моими HTML-файлами — по одному файлу для каждого состояния, в среднем около 500 параметров на файл… Как мне заставить его распознавать что-то вроде «44.729932, -72.381758» как $ lat и $ lon?! Или, в качестве альтернативы, как мне заставить мой выпадающий список передавать значения для lat и lon, если я сделаю параметры похожими на это:

 <option lat="44.976728" lon="-73.30257">Alburg</option>
  

Спасибо за чтение, извините, что оно такое длинное! Сейчас 2: 50 ночи, у меня из глаз течет кровь! : Помощь P очень ценится…

Ответ №1:

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

Подтвердите свое поле с помощью регулярного выражения типа -?[0-9] .[0-9] , -?[0-9] .[0-9] , затем explode его и получите два значения :

 list($lat, $lon) = explode(", ", $_GET['city']);
  

Здесь разделитель , включает пробел, чтобы удалить его, кстати.

Комментарии:

1. Возможно, вам больше понравится регулярное выражение ^-?d .d , -?d .d z . Кроме того, при проверке с помощью regex вы также можете использовать его для извлечения значений.

2. Большое спасибо! Это работает отлично! Если я понимаю назначение кода регулярных выражений, предложенного вами и Алексом, в этом нет необходимости, потому что все это пришло из надежного источника, и я запустил регулярные выражения и расширенные выражения в Notepad , чтобы прояснить ситуацию и убедиться, что все в правильном формате. Спасибо, ребята, это убивало меня! 😛

3. @tylerl Какой надежный источник? Интернет?

4. Хахаха… как насчет правительства США? 😛

Ответ №2:

Вы могли бы попробовать это…

 if (isset($_GET['location']) AND strpos($_GET['location'], ', ') !== FALSE) {
   list($latitude, $longitude) = explode(', ', $_GET['location']);
}
  

…хотя это также будет успешно разделено, если кто-то отправит вам что-то забавное вроде hello -4.3, 3.1 bye! .

Ideone.


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

 if ($location = filter_input(INPUT_GET, 'location')) {
   preg_match('/^(?P<latitude>-?d .d ), (?P<longitude>-?d .d )z/', $location, $matches);

   $latitude = $matches['latitude'];
   $longitude = $matches['longitude'];
}
  

Ideone.

Описанная выше проблема с дополнительными данными с обеих сторон не будет проблемой с регулярным выражением.

Ответ №3:

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

Если вы настаиваете на том, чтобы делать это таким образом, то вы можете использовать explode () для разделения возвращаемого значения.