PHP - 这是进行这些更改的有效方式吗?

时间:2017-09-02 23:35:49

标签: php

我非常关心大写(可能太多)。所以我编写了一个函数来修复我网站上的大写。我基本上想要“标题案例”,但有一些例外......我不喜欢看大写和首字母缩略词。

function my_capitals($string)
{
    $uc = ucwords($string);
    $tokens = explode(' ',$uc);
    foreach ($tokens as $key=>$val)
    {
        if ($val == 'Ipa') $tokens[$key] = 'IPA';
        else if ($val == 'Ipas') $tokens[$key] = 'IPAs';
        else if ($val == 'Apa') $tokens[$key] = 'APA';
        else if ($val == 'Apas') $tokens[$key] = 'APAs';
        else if ($val == 'A') $tokens[$key] = 'a';
        else if ($val == 'And') $tokens[$key] = 'and';
        else if ($val == 'The') $tokens[$key] = 'the';
        else if ($val == 'In') $tokens[$key] = 'in';
        else if ($val == 'Or') $tokens[$key] = 'or';
        else if ($val == 'Of') $tokens[$key] = 'of';
        else if ($val == 'To') $tokens[$key] = 'to';
        else if ($val == 'On') $tokens[$key] = 'on';
        else if ($val == 'At') $tokens[$key] = 'at';
        else $tokens[$key] = $val;
    }
    $final = implode(' ',$tokens);
    return $final;
}

想象一下,可能还有另外10-15个选项,每页可以在相对较短的字符串上运行3-5次(单行描述和标题)。

我的问题是:这是完成此类翻译的有效方法吗?或者我应该找出一种更有效的方法吗?还有另一种我不知道的替代方案,而不仅仅是可能具有相似性能的开关吗?

3 个答案:

答案 0 :(得分:2)

首先,您必须考虑高效对您意味着什么。你在找

吗?
  • 最短的执行时间
  • 最小的系统影响(CPU,RAM,I / O ......)
  • 最干净的代码(高效编码)
  • 最短的代码
  • ...

其次,鉴于你的详细信息......

  1. 大约有30个搜索字词
  2. 字符串很短
  3. 并且代码最多激活5次
  4. ...除非您在脚本中使用烤面包机,否则执行时间和系统影响都不会给您带来任何麻烦。

    实际上,这取决于干净的代码。因此,您应该了解=====的区别。 接下来,您已经有一个字符串可以搜索多个字符串特定函数$uc

    那么str_replace呢?它接受数组作为输入。

    function my_capitals($string)
    {
        $uc = " ".ucwords($string)." ";
        $search = [' Ipa ', ' Ipas ', ' A ', ' Bändy '];
        $replacements = [' IPA ', ' IPAs ', ' a ', ' Cändy '];
        return ucfirst(trim(str_replace($search, $replacements, $uc)));
    }
    

    您甚至可以将其缩短为1行:

    function my_capitals($string)
    {
        return ucfirst(trim(str_replace([' Ipa ', ' Ipas ', ' A ', ' Bändy '], [' IPA ', ' IPAs ', ' a ', ' Cändy '], " ".ucwords($string)." ")));
    }
    

    只需确保$search$replacements包含相同数量的元素,并且都包含前导和尾随空格。

    只需分配一次数组就可以提高连续调用的速度。

    function my_capitals1a($string, $searcher, $replacement)
    {
        return ucfirst(trim(str_replace($searcher,$replacement, " ".ucwords($string)." ")));
    }
    

    演示和速度比较:http://sandbox.onlinephpfunctions.com/code/fd594ab47b78778981dc0a58432e141f48f9b6e7

    编辑:单词安全替换 Edit2:速度比较 Edit3:改进了来自@Pogrock的提示

答案 1 :(得分:0)

我会这样做:

   function my_capitals($string)
    {
        $uc = ucwords($string);
        $tokens = explode(' ',$uc);
        $excepsions = ['Ipa'=>'IPA','Ipas'=>'IPAs'];
        foreach ($tokens as $key=>$val)
        {
            if(isset($excepsions[$val])){
                $tokens[$key] = $excepsions[$val];
            }
        }
        $final = implode(' ',$tokens);
        return $final;
    }

答案 2 :(得分:0)

OP代码略有不同。大写输入标题中的所有单词,然后交换像And for和。最后初始化标题的开头。

你可以先用字符串来标准化你的标题,但这可能会打破像O' Hagan这样的名字。

还有许多其他边缘案例未被涵盖,您可能最好以速度换取全功能库。

Class<TempView>