Php 我如何确定人名是否表示所有格;s";德语中是否应该省略?

Php 我如何确定人名是否表示所有格;s";德语中是否应该省略?,php,Php,我正在尝试构建一个函数,该函数将为我提供正确的德语所有格形式的名称。假设我有三个名字:拉尔斯、亚历克斯和蒂娜 所有格为“拉尔斯高速公路、亚历克斯高速公路和蒂纳斯高速公路”。 如果名字的最后一个字母是S或X,我必须加一个撇号,在其他情况下,我只需要在名字上加上S 但是,当我使用我的函数时,它总是在每个名字(拉尔斯、亚历克斯、蒂纳斯)的末尾加上一个S 我做错了什么 编辑:出于文档目的-如果您希望将规则应用于所有常用名称,这是一种解决方案 function possessive_de($name) {

我正在尝试构建一个函数,该函数将为我提供正确的德语所有格形式的名称。假设我有三个名字:拉尔斯、亚历克斯和蒂娜

所有格为“拉尔斯高速公路、亚历克斯高速公路和蒂纳斯高速公路”。
如果名字的最后一个字母是S或X,我必须加一个撇号,在其他情况下,我只需要在名字上加上S

但是,当我使用我的函数时,它总是在每个名字(拉尔斯、亚历克斯、蒂纳斯)的末尾加上一个S

我做错了什么

编辑:出于文档目的-如果您希望将规则应用于所有常用名称,这是一种解决方案

function possessive_de($name) {
    $lastCharacter = $name[strlen($name) - 1];

    $excluded = ['s','x','z','ß'];

    if(substr($name, -2) == 'ce') {
        return $name . '’';
    } else if (in_array($lastCharacter, $excluded)) {
        return $name . '’';
    } else {
        return $name . 's';
    }   
}
产出将是:

echo possessive_de("Tina"); // echoes Tinas
echo possessive_de("Alex"); // echoes Alex'
echo possessive_de("Lars"); // echoes Lars'
echo possessive_de("Leibniz"); // echoes Leibinz'
echo possessive_de("Maurice"); // echoes Maurice'

|
应该是
&&

您要检查最后一个字符
是否不是x
是否不是s


或者,检查最后一个字符
是否为x
是否为s

仅与您的问题略微相关,但您可以将函数简化为:

function possessive_de($name) 
{
    $lastCharacter = $name[strlen($name) - 1];

    $excluded = [
        's',
        'x',
        'z',
        'ß',
    ];

    if (in_array($lastCharacter, $excluded)) {
        return $name . '’';
    }

    return $name . 's';
}
根据我们在评论中的小对话,如果你承认有更多的名称结尾可能表示省略所有格s,而使用撇号,请尝试以下方法:

注意所有代码示例都假定
$name

  • 是非空字符串(仅由空格组成)
  • 修剪
  • 不是空字符串
有关参考,请参阅:


前两条规则应该相等,而不是相等!我现在真的感到惭愧。这太简单了。谢谢!很高兴你喜欢它,@GerritFries!请注意,似乎有更多的结尾表示省略s而使用撇号,请参见。您完全正确!我从来没有想过“ce”——结局像莫里斯。考虑到这一点,我需要再次检查最后一个字符是否为“e”,以检查最后一个字符之前的字符是否为“c”。添加了一个示例以包括其他名称结尾!伟大的但foreach循环中的$length不应该是strlen($ending)?
function possessive_de($name) 
{
    $lastCharacter = $name[strlen($name) - 1];

    $excluded = [
        's',
        'x',
        'z',
        'ß',
    ];

    if (in_array($lastCharacter, $excluded)) {
        return $name . '’';
    }

    return $name . 's';
}
function possessive_de($name)
{
    $endings = [
        'ce',
        's',
        'ss',
        'tz',
        'x',
        'z',
        'ß',
    ];

    foreach ($endings as $ending) {
        if (substr($name, -strlen($ending)) === $ending) {
            return $name . '’';
        }
    }

    return $name . 's';
}