2017-09-02 44 views
2

我很关心大写(可能太多)。所以我写了一个函数,可以在我的网站上无处不在修复大写字母。我基本上想要“标题案例”,但有一些例外......我不喜欢看到大写和首字母缩略词。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次。

我的问题是这样的:这是一种有效的方法来完成这种翻译?或者我应该想出一个更有效的方法来做到这一点?是否有另一种我不知道的选择,而不是仅仅是可能具有相似性能的开关?

+0

的可能重复[这是如果更快,更好,开关箱或其他若?(https://stackoverflow.com/questions/10773047/which-is-faster-and-better-switch-case -or-if-else-if) – Haroon

+0

新的线路资本如何?你还想要那些小型的? – deg

+0

@deg,我没有考虑过新的线路首都......我不确定这些是否没有被我目前的情况所困扰。 – JessycaFrederick

回答

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; 
    } 
+0

我开始做它就像一个“重构”一样,但我不确定它是否会更有效率。感谢您的建议。 – JessycaFrederick

+1

谢谢您在'isset'子句 – rndus2r

+0

@ rndus2r中丢失了一个右括号。无论如何,我认为你的回答要好得多 –

2

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

  • 执行时间最短
  • 最小系统的影响(CPU,内存,I/O ...)
  • 最干净的代码(有效编码)
  • 最短的代码
  • ...

其次,鉴于你的细节......

  1. 大约有30个搜索字词
  2. 串短
  3. 和代码发射了5次

...除非你正在使用一台烤面包机您的脚本,没有执行时间,也没有系统任何手段的影响都会给你带来任何头痛。

所以它实际上取决于干净的代码。因此,您应该知道=====的区别。 接下来,您已经有一个字符串可以搜索几个字符串特定函数$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

你可能需要在这些空格上留下空格。例如“安迪”。 – Progrock

+0

感谢您提供一些框架来思考问题。我特别感兴趣的是最短的执行时间。我是唯一一个阅读代码的人,尽管我为了自己的未来健全而对自由地评论,但干净/短代码并不是我的最高优先级。我以前审查== vs ===。我首先明白了它们的不同之处,因为这些都是字符串,所以我认为我对==很好。结果===更快,所以谢谢!!)。我将探索str_replace效率。谢谢! – JessycaFrederick

+0

@Progrock感谢您指出这一点,我已经更新了答案 – rndus2r

0

的OP代码的细微变化提高。大写输入标题中的所有单词,然后将单词换成And for和。最后初始化标题的开头。

您可以先用字符串将您的标题规范化为较低,但这可能会破坏名称,如O'Hagan。

还有很多其他的边缘案例没有涉及,您可能更好地交易速度的全功能库。

<?php 
$replacements = [ 
     'Ipas' => 'IPAs', 
     'Apa' => 'APA', 
     'Apas' => 'APAs', 
     'A' => 'a', 
     'And' => 'and', 
     'The' => 'the', 
     'In' => 'in', 
     'Or' => 'or', 
     'Of' => 'of', 
     'To' => 'to', 
     'On' => 'on', 
     'At' => 'at', 
]; 

$test_titles = [ 
    'a tale of two cities' => 'A Tale of Two Cities', 
    'the secret history'  => 'The Secret History', 
    'lord of the flies'  => 'Lord of the Flies', 
    'The woman in white'  => 'The Woman in White', 
    'of mice and men'   => 'Of Mice and Men', 
    'the andy warhol diaries' => 'The Andy Warhol Diaries' 
]; 

foreach($test_titles as $input => $title_cased) { 
    $words = []; 
    foreach(explode(' ', ucwords($input)) as $word) { 
     $words[] = isset($replacements[$word]) ? $replacements[$word] : $word; 
    } 
    $transformed = ucfirst(implode(' ', $words)); 
    assert($transformed === $title_cased); 
} 
+0

Wheels与@Andriy Lozynskiy的区别是什么? – rndus2r

+0

@ rndus2r从哪里开始?它们的函数有语法错误,即使更正也不起作用。 – Progrock

+0

它只是缺少a)并且它能正常工作:http://sandbox.onlinephpfunctions.com/code/b84dd027760e073c147da0a4f0831ed851d2fd71 – rndus2r