Обмен строки, где в php найдено пространство - PullRequest
0 голосов
/ 03 декабря 2009

Мне нужно реализовать следующую функциональность:

У меня есть поле имени, которое содержит как имя, так и фамилию. Он хранится в базе данных и находится в порядке «фамилия».

Я реализую скрипт, который просматривает эти записи. В настоящее время мне удалось проверить, содержит ли строка пробел, если она содержит пробел, это означает, что это имя, а не номер идентификационной карты, например. Вот код:

$query = "John Doe";

$checkIfSpaceExists = strpos($query, " ");

if ($checkIfSpaceExists == "")
{
    //No Space therefore it is not a name
}
else
{
    //Contains space
   $queryExploded = explode(" ", $query);
   foreach ($queryExploded as $q)
   {
      //Here I need the functionality so that if someone entered John Doe
      //2 different strings are saved, which are
      //$string1 = John Doe
      //$string2 = Doe Johns

      //If the name consists of 3 parts, strings for every combination is saved
}

Затем я вставлю эти строки в оператор SQL с атрибутом LIKE, и будет как LIKE для JOHN DOE и DOE JOHN. Следовательно, если пользователь может либо ввести Джона Доу, либо Доу Джона, чтобы найти результат.

Любые предложения о том, как это сделать?

Большое спасибо

* 1014 Крис *

Ответы [ 5 ]

2 голосов
/ 03 декабря 2009

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

if (strpos($query, ' ') === false)  // the triple-equals is important!

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

1 голос
/ 03 декабря 2009

А как насчет использования этих 3 разнесенных строк в отдельных И-объединенных LIKE-ограничениях?

Что-то вроде

"... WHERE name LIKE '%$name[0]%' AND name LIKE '%$name[1]%' AND name LIKE '%$name[2]%'"

Вы можете построить эту строку в цикле foreach.

0 голосов
/ 03 декабря 2009

С некоторыми циклами и манипуляциями со строками мне удалось реализовать этот скрипт.

Вот что я сделал:

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

Вот код:

   $like = ""; //This is the LIKE sql command.
   foreach ($selectedFields as $field)
   {
            $checkIfSpaceExists = strpos($query," ");

    if ($checkIfSpaceExists != "")
    {
        $query1 = $query; //No space, so query1 is equal ta original query

        $queryExploded = explode(" ", $query);

        for ($i=0; $i<count($queryExploded); $i++) //First loop (name surname)
        {
            $tmp1 = $tmp1 . " " . $queryExploded[$i];
        }

        for ($i=count($queryExploded); $i>=0; $i--) //Second loop (surname name)
        {
            $tmp2 = $tmp2 . " " . $queryExploded[$i];

        }
        $query2 = $tmp2;
        $query2 = trim($query2);

        $like = $like . $field . " LIKE '%" . $query1 . "%' or " . $field . " LIKE '%" . $query2 . "%' or ";

Надеюсь, это поможет кому-то еще нуждающемуся:)

0 голосов
/ 03 декабря 2009

Полагаю, вы не можете разделить это поле на имя и фамилию? Я предлагаю создать новую таблицу, теги в базе данных. Теги будут любым словом - может быть фамилией, может быть именем, может быть идентификационным номером ... Затем установите соединение record_tags с record_id и tag_id. Тогда запрос будет выглядеть как

SELECT record.* FROM record
INNER JOIN record_tags rt1 ON rt1.record_id = record.id
INNER JOIN tag t1 ON t1.id = rt1.tag_id
INNER JOIN record_tags rt2 ON rt2.record_id = record.id
INNER JOIN tag t2 ON t2.id = rt2.tag_id
WHERE
t1.name = "John"
AND t2.name = "Doe"

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

0 голосов
/ 03 декабря 2009
echo preg_replace('/^(\w+) (\w+)$/', '$2 $1', "John Doe");

Доу Джон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...