2017-09-02 108 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

相關問題