2017-06-04 94 views
-1

現在爲我的腳本編寫這個函數。它工作得很好,但有點慢。考慮一下這個功能,如果你有最佳的選擇,請求我幫忙。如何簡化和優化功能?

這裏是我的代碼:

function izada($array) { 
    foreach ($array as $key => $value) { 
     if(substr_count($value, "ӣ") == 2) { 
      $result[] = str_replace("ӣ ", "ӣ, ", $value); 
     } 
     if(mb_substr($value, -1) !== "ӣ") { 
      unset($array[$key]); 
     } 
     if(substr_count($value, "ӣ") == 2) { 
      unset($array[$key]); 
     } 
     $array = array_filter(array_unique(array_merge($array, $result))); 
    } 
    foreach ($array as $key => $value) { 
     if(substr_count($value, "ӣ") > 2 || substr_count($value, "ӣ") < 1) { 
      unset($array[$key]); 
     } 
    } 
    return $array; 
} 

輸入和函數調用:

$array = array (
    "забони тоҷикӣ", 
    "хуҷандӣ бӯстонӣ", 
    "Тоҷикистон Ватанам", 
    "Ғафуровӣ Мичуринӣ Савхозӣ", 
    "Конверторӣ хуруфҳо" 
); 

$array = izada($array); 

echo"<pre>"; 
print_r($array); 
echo"</pre>"; 

結果必然是:

Array (
    [0] => забони тоҷикӣ 
    [1] => хуҷандӣ, бӯстонӣ 
) 

回答

2

的Jakub的回答是不優化,是根據你的發佈方法可能不正確的。

  • 它允許值爲2的可能性,但不能以ӣ結束纔有資格。 (如果這是可接受的,那麼你應該澄清你的問題要求。)

  • 它調用substr_count()每次迭代1到3次(取決於條件結果)。爲了提高效率,重要的是要儘量減少函數調用。

這是一個更準確的/有效的方法:

輸入:

$array=[ 
    "забони тоҷикӣ", 
    "хуҷандӣ бӯстонӣ", 
    "Тоҷикистон Ватанам", 
    "Ғафуровӣ Мичуринӣ Савхозӣ", 
    "Конверторӣ хуруфҳо" 
]; 

方法:(Demo

foreach($array as $v){ 
    if(mb_substr($v,-1)=="ӣ"){     // require last char to be ӣ 
     if(($count=substr_count($v,"ӣ"))==1){ 
      $result[]=$v;       // do not replace if only 1 ӣ 
     }elseif($count==2){ 
      $result[]=str_replace("ӣ ","ӣ, ",$v); // replace qualifying ӣ's if 2 ӣ's 
     } 
    } 
} 
var_export($result); 

輸出:

array (
    0 => 'забони тоҷикӣ', 
    1 => 'хуҷандӣ, бӯстонӣ', 
) 

請注意,我的方法首先要求最終字符爲ӣ,這樣可以提供最快的回報,而無需爲非限定值聲明/覆蓋$count$count用於緩存每次迭代的結果substr_count()。通過這樣做,迭代只需要進行一次函數調用 - 提高效率。

1

所有array_mergearray_unique佔用了不必要的資源。爲什麼不創建輸出數組並填充所需的數據,而不是試圖改變原始數組?

還有幾個多餘的條件 - 你幾次檢查同一個東西。從我的理解,這是你想要的:

返回所有字符串,其中ӣ存在一次或兩次,無論是在最後或兩次任何地方。如果出現兩次,請加上昏迷。

所以,你可以把它簡化像

function izada($array) { 
    $ret = []; 
    foreach($array as $string){ 
     if (substr_count($string, "ӣ") >= 1 && substr_count($string, "ӣ") <= 2) { 
      if(substr_count($string, "ӣ") == 2) { 
       $ret[] = str_replace("ӣ ", "ӣ, ",$string); 
      } 
      else if (mb_substr($string, -1) == "ӣ") { 
       $ret[] = $string; 
      } 
     } 
    } 
    return $ret; 

}

+1

謝謝!下一次我寫函數時,我會考慮你尊敬的雅各布猶大的建議! :) – Otabek