#php #arrays #if-statement #optimization #preg-match
#php #массивы #if-оператор #оптимизация #preg-match
Вопрос:
Я использую следующую функцию в PHP для определения объекта и местоположения по строкам, которые содержат в нем «near», используя preg_match();
. Есть ли более оптимальный способ написать код для этого? Я использую много операторов if, и кажется, что это можно улучшить, но я не уверен, как.
// Test cases
$q = "red robin near seattle";
//$q = "red robin near me";
//$q = "red robin nearby";
//$q = "red robin near my location";
function getEntityAndLocation($q){
$entityAndLocation = array("entity" => null, "location" => null);
if(preg_match('(nearby)', $q) === 1) {
$breakdown = explode("nearby", $q);
$entityAndLocation["entity"] = $breakdown[0];
$entityAndLocation["location"] = $breakdown[1];
return $entityAndLocation;
}
if(preg_match('(near my location)', $q) === 1) {
$breakdown = explode("near my location", $q);
$entityAndLocation["entity"] = $breakdown[0];
$entityAndLocation["location"] = $breakdown[1];
return $entityAndLocation;
}
if(preg_match('(near me)', $q) === 1) {
$breakdown = explode("near me", $q);
$entityAndLocation["entity"] = $breakdown[0];
$entityAndLocation["location"] = $breakdown[1];
return $entityAndLocation;
}
if(preg_match('(near)', $q) === 1) {
$breakdown = explode("near", $q);
$entityAndLocation["entity"] = $breakdown[0];
$entityAndLocation["location"] = $breakdown[1];
return $entityAndLocation;
}
}
if(preg_match('(near)', $q) === 1) {
$entityAndLocation = getEntityAndLocation($q);
print_r($entityAndLocation);
}
Комментарии:
1. итак, вы хотите посмотреть, содержит ли строка определенную «фразу / слово»?
Ответ №1:
используется preg_split()
для использования регулярного выражения в качестве разделителя для разделения строки. Вы можете написать единственное регулярное выражение, которое соответствует всем вашим шаблонам.
function getEntityAndLocation($q){
$entityAndLocation = array("entity" => null, "location" => null);
$breakdown = preg_split('/near(?:by| my location| me)?/', $q);
if (count($breakdown) >= 2) {
$entityAndLocation["entity"] = $breakdown[0];
$entityAndLocation["location"] = $breakdown[1];
return $entityAndLocation;
}
return $entityAndLocation;
}
Соответствует регулярное выражение near
, за которым необязательно следует by
, my location
или me
.
Комментарии:
1. Хм, у меня возникли проблемы с его реализацией. Вы имели в виду поместить $entityAndLocation = array(«entity» => null, «location» => null); перед $breakdown? Кроме того, означает ли $ 1 значение $ q?
2. Да, это просто заменяет все
if
инструкции, ничего больше.3. Я использую вашу функцию с «red robin near seattle» и получаю пустой массив в качестве вывода. В частности, Array ( [entity] => [location] => )
4. Извините, опечатка,
:?
должно было быть?:
5. Странно, я изменил:? кому?: но я все еще получаю пустой массив $entityAndLocation