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

ヤクブの答えを最適化し、あなたの掲示方法によれば、潜在的に間違っているされていないようなので、あなたはそれを簡略化することができます。

  • 2ӣの値でӣで終わらない可能性があります。

  • substr_count()(条件付きの結果に応じて)1回につき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回行うだけで効率を向上させることができます。

1

すべてarray_mergearray_uniqueは、不要なリソースを占有しています。元の配列を変更しようとするのではなく、出力配列を作成し、それに必要なデータを入力するのはなぜですか?

いくつかの冗長な条件もあります。同じことを何回かチェックしています。

ӣが存在するすべての文字列を、末尾または2桁のいずれかに1〜2回返します。それが2回存在する場合は、昏睡状態を追加します。

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

関連する問題