2017-06-04 92 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