2017-03-27 5 views
1

こんにちは私は、二重の値を見つけて列挙するための簡単な解決策を探しています。PHPは配列の中で二重の値を見つけてそれらを列挙します

array("Papples", "Gelato", "Gelato", "Banana", "Papples","Papples") 

array("Papples", "Gelato", "Gelato2", "Banana", "Papples2","Papples3") 

私は、ifとループでそれを行うと、二番目の配列手順への書き込みが、そこにそれのためのよりよい解決策ではないだろうか?

ありがとうございました!

答えて

1

あなたが試すことができ

<?php 
$arr = array("Papples", "Gelato", "Gelato", "Banana", "Papples","Papples"); 

$countarray = array_count_values($arr); 

$resultarray = array(); 
foreach ($countarray as $key=>$value) { 
    for ($i = 1; $i <= $value; $i++) { 
    $resultarray[]=$key.$i; 
    } 
} 

print_r($resultarray); 

?> 
0
$arr = array("Papples", "Gelato", "Gelato", "Banana", "Papples","Papples"); 
    $arr_count = array_count_values($arr); 
    $new_arr = array(); 
    foreach($arr_count as $key=>$val){ 
     if($val > 1){ 
      $k = 1; 
      for($i=0; $i<$val; $i++){ 
       if($i==0){ 
        $new_arr[] = $key; 
       }else{ 
        $new_arr[] = $key.++$k; 
       } 
      } 
     }else{ 
      $new_arr[] = $key; 
     } 
    } 
    echo "<pre>"; print_r($new_arr); 

テストスクリプト:ループとifhttps://3v4l.org/iGf1s

1

Goが、それは難しいことではありませんし、非常に高速になります。

$delicatessen = [ 
    "Papples", "Gelato", "Gelato", "Banana", "Papples","Papples" 
]; 

foreach ($delicatessen as $e) { 
    if (@$counter[$e]++) $e .= $counter[$e]; 
    $new[] = $e; 
} 

は、基本的にこれが何をするか、常に新しい配列に要素を追加することで明確に が、それを修正するかどうか。条件は、$counter配列 で、アイテムが表示される時間を格納します。すべては " the fly"上に作成され、PHPはこれを許可します。

$counter[$e]を検索すると、この要素はまだ存在しないため、 の戻り値は条件を満たさなくします。しかし、 のundefが返された後には、それは(++)となりますので、 は$counter[$e]になります。1になります。

これは 1の戻り値は、側で、条件のパスを行います再度アクセスされる将来の繰り返しの場合は、ポイント でif文が$counter[$e]はすでに2になります実行されることに影響します。 ステートメントは、この番号を要素の末尾に連結します。

このように、最初は何も連結されていませんが、 副作用があります。次の反復で、番号は 要素に連結されます。

ここでは、@演算子を使用してPHP通知を抑制します。あなたは で、最初のパスで未定義の要素を扱っているので、通知があります。 スクリプトは中断しません。もちろん、この演算子は注意して を使用する必要がありますが、この場合は実際にコードを簡素化するのに役立ちます。 はそれほど厳密ではありません。

+0

「if」条件について説明してください。 – Bhaskar

+0

@Bhaskar確かに、答えを更新:) – sidyll

関連する問題