【问题标题】:Selection from MySQL - only the initial from the Last Name从 MySQL 中选择 - 仅来自姓氏的首字母
【发布时间】:2014-08-29 07:43:05
【问题描述】:

我在从数据库中进行选择时有一个问题:

我的一张表中的一列包含人员的姓名。假设它看起来像这样:

 1. John Smith
 2. William Thorne
 3. Mark Johanson

好的,我已经向您展示了一些随机名称的示例。

问题是,名字和姓氏都在同一列中,当我在我的 php 文件中进行选择时,我想要得到的结果是这样的:

1. John S.
2. William T.
3. Mark J.

我希望每个人的姓氏仅显示姓氏的首字母。有可能这样做吗?如果有,任何帮助都会很棒。

我的代码选择示例在这里:

$result = mysql_query("SELECT * FROM feedback_rate 
                       WHERE accept=1 
                       ORDER BY date DESC 
                       LIMIT $start,$rows_per_page",$con);

提前感谢您的帮助。

【问题讨论】:

  • 靠空格指定名字和姓氏是不可靠的。你为 Mary Jo De Rossi 做了什么?
  • @GeorgeGarchagudashvili Mary Jo 是一个双重名称,Mary J 从规范来看是不正确的。
  • 这只是他想要达到的目标的猜测:))

标签: php mysql select


【解决方案1】:

您必须意识到,要做到这一点非常困难。计算机不知道名字,他们不知道什么是名字,什么是姓氏。因此,您将不得不做出并不总是正确的假设。我假设总是只有一个名字。然后在PHP中很容易解决,步骤如下:

  1. 将名称拆分为单词。
  2. 更改最后一个字。
  3. 将它们重新组合在一起。

这是这样做的:

$parts = explode(' ',$fullName);
$firstName = array_pop($parts);
$initial = substr($firstName,0,1);
array_push($parts,$initial.'.');
$fullName = implode(' ',$parts);

现在 $fullName 将包含您想要的内容。代码看起来有点长,但那是因为我尝试一步一步地展示它。

【讨论】:

  • PHP 可以做到这一点更短:$fullName = substr($fullName,0,strrpos($fullName,' ')+1).'.'; 但这会更难理解吗?更多变体是可能的。
  • 请注意,这种方法不能识别多字节,因此在使用 UTF-8 输入时可能会得到损坏的输出。
【解决方案2】:

最好在 PHP 中操作数据(保持原始数据不变,这始终是一个好习惯):

$name = "John Sephre";
$expl = explode(' ', $name);

echo $expl [0].' '.$expl[1][0];

输出:

John S

如果你的名字很长:

$name = "John Sephre More";
$expl = explode(' ', $name);

$last = end($expl);

echo $expl[0].' '.$last[0];

输出:

John M

我还建议为此目的创建函数:

function makeShortName($fullName)
{
    $expl = explode(' ', $fullName);

    $shortened = $expl[0];

    if(count($expl) > 1)
    {
        $last = end($expl);
        $shortened .= ' '.$last[0].'.';
    }

    return $shortened;
}

所以如果你只传递John,它将返回John,如果你传递John nickname Surname,结果将是John S.

【讨论】:

    【解决方案3】:

    我发现这是处理这个问题的最简单方法。它只是在字符串的最后一个单词上创建一个首字母。这允许像“van Dyke”这样的双桶姓氏,变成“van D”。请注意,带连字符的名称仍将缩减为第一个字符,但这不太可能成为问题。如果字符串中只有一个单词,则不会被初始化。简单的三行代码:

    $nameparts = explode(' ',$fullname);
    if(count($nameparts) > 1) $nameparts[count($nameparts)-1] = substr($nameparts[count($nameparts)-1],0,1);
    $fullname = implode(' ',$nameparts);
    

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 2013-03-26
      • 2022-08-14
      • 1970-01-01
      相关资源
      最近更新 更多