62

私は、ユーザーがフルネームでユーザーを検索できるプライベート メッセージ システムを開発しています (例: "George Washington")。

と という名前の 2 つの変数が$firstnameあり$lastname、検索関数は関連性 (その人に何回メッセージを送信したか) で結果を並べ替えます。$firstname="George""George Washington" をとに分割するテキスト フィールドを取得するにはどうすればよい$lastname="Washington"ですか?

4

17 に答える 17

125

最も簡単な方法は、explodeを使用することです。

$parts = explode(" ", $name);

パーツを入手したら、最後のパーツを次のようにポップします$lastname

$lastname = array_pop($parts);

最後に、配列の残りの部分を次のように内包します$firstname

$firstname = implode(" ", $parts);

例:

$name = "aaa bbb ccc ddd";

$parts = explode(" ", $name);
if(count($parts) > 1) {
    $lastname = array_pop($parts);
    $firstname = implode(" ", $parts);
}
else
{
    $firstname = $name;
    $lastname = " ";
}

echo "Lastname: $lastname\n";
echo "Firstname: $firstname\n";

結果は次のようになります。

tomatech:~ ariefbayu$ php ~/Documents/temp/test.php 
Lastname: ddd
Firstname: aaa bbb ccc
于 2012-11-30T01:03:21.630 に答える
85

名だけがあるかどうかを確認する努力があるので、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('#'.preg_quote($last_name,'#').'#', '', $name ) );
    return array($first_name, $last_name);
}

例 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('#'.preg_quote($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'
);

別の方法 - Sans Regex

正規表現を使用しない別の方法を追加することにしました。

またreturn false;、認識できない名前 (null、空の文字列、推測するには単語グループが多すぎる) も含まれます。

<?php

function split_name($string) {
    $arr = explode(' ', $string);
    $num = count($arr);
    $first_name = $middle_name = $last_name = null;
    
    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 : compact(
        'first_name', 'middle_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] => NULL
    [last_name] => Mcgee
)

Array
(
    [first_name] => Angela
    [middle_name] => Bob
    [last_name] => Mcgee
)

Array
(
    [first_name] => Angela
    [middle_name] => NULL
    [last_name] => NULL
)

false

false

false
于 2015-07-10T00:00:38.250 に答える
28

正確に2単語の入力がある場合は、使用できますlist()

list($firstname, $lastname) = explode(" ", $string);

とにかく使えるexplode()

$words = explode(" ", $string);

$firstname = $words[0];
$lastname = $words[1];
$third_word = $words[2];
// ..
于 2012-11-30T00:23:35.457 に答える
17

私の状況では、最初と最後を取得する簡単な方法が必要でしたが、基本的なミドル ネームを説明します。

$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 . '.';

出力:

最初:ビリー、最後:ジョンソン、真ん中:ボビー。

于 2013-04-11T20:22:21.083 に答える
6

http://php.net/manual/en/function.explode.php

$string = "George Washington";
$name = explode(" ", $string);
echo $name[0]; // George 
echo $name[1]; // Washington
于 2012-11-30T00:22:13.897 に答える
6

これは、いくつかの境界チェックを伴う答えです。

上記の答えは正しいですが、最初から実際に有効な名前を持っていることを確認するための境界条件チェックの形式は提供していません。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);
}

これは姓が単一の単語であると仮定しているのに対し、名は任意の組み合わせであることに注意してください。逆の効果を得るには、 に交換しarray_pop()ますarray_shift()

于 2015-03-06T20:34:09.920 に答える
4
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
于 2016-08-23T22:26:53.957 に答える