Я разрабатываю частную систему сообщений, которая позволяет пользователям искать пользователя по их полному имени, например: «Джордж Вашингтон».
У меня есть две переменные с именем $firstname
и $lastname
, а функция поиска заказывает результаты по релевантности (сколько раз вы отправляли сообщение этому человеку). Как получить текстовое поле для разделения «Джордж Вашингтон» на $firstname="George"
и $lastname="Washington"
?
Мне нравится ответ cballou, потому что есть попытка проверить, есть ли только первое имя. Я думал, что добавлю свои функции для всех, кто придет посмотреть.
Вот код:
// uses regex that accepts any word character or hyphen in last name function split_name($name) { $name = trim($name); $last_name = (strpos($name, ' ') === false) ? '' : preg_replace('#.*\s([\w-]*)$#', '$1', $name); $first_name = trim( preg_replace('#'.$last_name.'#', '', $name ) ); return array($first_name, $last_name); }
Ex 1: split_name('Angeler')
:
array( 0 => 'Angeler', 1 => '' );
Пример 2: split_name('Angeler Mcgee')
:
array( 0 => 'Angeler', 1 => 'Mcgee' );
Пример 3: split_name('Angeler Sherlee Mcgee')
:
array( 0 => 'Angeler Sherlee', 1 => 'Mcgee' );
Чтобы получить разделение первого и второго имени,
Пример 4: split_name('Angeler Sherlee')
:
array( 0 => 'Angeler', 1 => 'Sherlee' );
Позже я решил, что было бы неплохо, если бы среднее имя получилось автоматически, если это применимо, поэтому я написал эту функцию.
function split_name($name) { $parts = array(); while ( strlen( trim($name)) > 0 ) { $name = trim($name); $string = preg_replace('#.*\s([\w-]*)$#', '$1', $name); $parts[] = $string; $name = trim( preg_replace('#'.$string.'#', '', $name ) ); } if (empty($parts)) { return false; } $parts = array_reverse($parts); $name = array(); $name['first_name'] = $parts[0]; $name['middle_name'] = (isset($parts[2])) ? $parts[1] : ''; $name['last_name'] = (isset($parts[2])) ? $parts[2] : ( isset($parts[1]) ? $parts[1] : ''); return $name; }
Пример 1: split_name('Angeler Sherlee Mcgee')
:
array( 'first_name' => 'Angeler', 'middle_name' => 'Sherlee', 'last_name' => 'Mcgee' );
Пример 2: split_name('Angeler Mcgee')
:
array( 'first_name' => 'Angeler', 'middle_name' => '', 'last_name' => 'Mcgee' );
Решил добавить другой способ, который не использует регулярное выражение.
Он также return false;
для не распознаваемых имен (нуль, пустая строка, слишком много групп слов для вывода).
<?php function split_name($string) { $arr = explode(' ', $string); $num = count($arr); if ($num == 2) { list($first_name, $last_name) = $arr; } else { list($first_name, $middle_name, $last_name) = $arr; } return (empty($first_name) || $num > 3) ? false : array( 'first_name' => $first_name, 'middle_name' => $middle_name, 'last_name' => $last_name, ); } var_dump(split_name('Angela Mcgee')); var_dump(split_name('Angela Bob Mcgee')); var_dump(split_name('Angela')); var_dump(split_name('')); var_dump(split_name(null)); var_dump(split_name('Too Many Names In Here'));
Выходы
Array ( [first_name] => Angela [middle_name] => [last_name] => Mcgee ) Array ( [first_name] => Angela [middle_name] => Bob [last_name] => Mcgee ) Array ( [first_name] => Angela [middle_name] => [last_name] => ) false false false
Самый простой способ – с помощью взрыва:
$parts = explode(" ", $name);
После того, как у вас есть части, поместите последний как $lastname
:
$lastname = array_pop($parts);
Наконец, отмените остальную часть массива как ваше $firstname
:
$firstname = implode(" ", $parts);
пример:
$name = "aaa bbb ccc ddd"; $parts = explode(" ", $name); $lastname = array_pop($parts); $firstname = implode(" ", $parts); echo "Lastname: $lastname\n"; echo "Firstname: $firstname\n";
Результат:
tomatech:~ ariefbayu$ php ~/Documents/temp/test.php Lastname: ddd Firstname: aaa bbb ccc
если у вас есть ровно 2-словный ввод, вы можете использовать list()
list($firstname, $lastname) = explode(" ", $string);
в любом случае вы можете использовать explode()
$words = explode(" ", $string); $firstname = $words[0]; $lastname = $words[1]; $third_word = $words[2]; // ..
В моей ситуации мне просто нужен простой способ получить первый и последний, но учет основных средних имен:
$parts = explode(' ', 'Billy Bobby Johnson'); // $meta->post_title $name_first = array_shift($parts); $name_last = array_pop($parts); $name_middle = trim(implode(' ', $parts)); echo 'First: ' . $name_first . ', '; echo 'Last: ' . $name_last . ', '; echo 'Middle: ' . $name_middle . '.';
Вывод:
Сначала: Билли, Последнее: Джонсон, Середина: Бобби.
Конечно, если вы серьезно хотите получить разумный анализ имен, то что-то вроде этого (или подобного) может быть полезно.
http://php.net/manual/en/function.explode.php
$string = "George Washington"; $name = explode(" ", $string); echo $name[0]; // George echo $name[1]; // Washington
list($firstname, $lastname) = explode(' ', $fullname,2);
Хотя приведенные выше ответы верны, они не предоставляют никаких условий проверки условий, чтобы убедиться, что вы действительно имеете действительное имя для начала. Вы можете пойти об этом с помощью проверки strpos()
чтобы узнать, существует ли пространство. Вот более обстоятельный пример:
function split_name($name) { $name = trim($name); if (strpos($name, ' ') === false) { // you can return the firstname with no last name return array('firstname' => $name, 'lastname' => ''); // or you could also throw an exception throw Exception('Invalid name specified.'); } $parts = explode(" ", $name); $lastname = array_pop($parts); $firstname = implode(" ", $parts); return array('firstname' => $firstname, 'lastname' => $lastname); }
Стоит отметить, что это предполагает, что lastname – это одно слово, тогда как первое имя может быть любой комбинацией. Для противоположного эффекта array_pop()
для array_shift()
.
function getFirstName($name) { return implode(' ', array_slice(explode(' ', $name), 0, -1)); } function getLastName($name) { return array_slice(explode(' ', $name), -1)[0]; } $name = 'Johann Sebastian Bach'; $firstName = getFirstName($name); $lastName = getLastName($name); echo "first name: $firstName\n"; echo "last name: $lastName\n";
Это приведет к:
first name: Johann Sebastian last name: Bach
Код:
$data='9790,2015-04-04' $result=explode(','$data); echo $result[0]; echo $result[1];
Вывод:
9790 2015-04-04