- ベストアンサー
phpで配列の重複データをチェック〜重複したデータを一回だけ表示する方法〜
- phpの配列で重複データをチェックし、重複したデータを一回だけ表示したい場合、以下のコードを使用します。
- 配列の要素を順に比較し、重複しているデータがあればカウントします。
- カウントが2以上の場合、重複データとして表示します。重複したデータが一回だけ表示されます。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>if ($value == $value2) { この$valueと$value2の中身が文字列の場合「==」を使うのは駄目だよ。 >foreach ($arry as $key => $value) { >foreach ($arry as $key => $value2) { $keyを上書きする理由は? 普通なら foreach ($arry as $key1 => $value) { foreach ($arry as $key2 => $value2) { としようよ そもそも添字をを拾ってきているんだからそれを有効活用しないと。 「===」もしくはstrcmp()関数を使おうね。 それと >if ($value == $value2) { > $err_count++; > if ($err_count >= 2) { > echo "重複".$value2; > } >} なんて変な書き方する? ものすごく効率悪いと思わない? if($value === $value2 && $key1!==$key2){ これ一つですむのでは? それと何故「2」だけが全角?
その他の回答 (5)
- yambejp
- ベストアンサー率51% (3827/7415)
よく考えればユニークして差分をとるだけですね <? $arry=Array("a","b","a","c","b","a"); $arry2=array_unique(array_diff_assoc($arry,array_unique($arry))); foreach($arry2 as $val) echo "重複".$val; ?>
- bx2
- ベストアンサー率47% (97/206)
修正したら下記のようになります。 foreach (array_unique($arry) as $value) { $err_count = 0; foreach ($arry as $value2) { if ($value == $value2) { $err_count++; } } if ($err_count >= 2) { echo "重複".$value.PHP_EOL; } } 書き直すと下記のようになります。 foreach (array_count_values($arry) as $key => $value) { if ($value >= 2) { echo "重複".$key.PHP_EOL; } }
- yambejp
- ベストアンサー率51% (3827/7415)
重複データが3つ以上ある場合をどうするのでしょうか? 考え方としては、都度走査するか、チェッカーを使うのが妥当かと <? $arry=Array("a","b","c","a","b","a"); while(count($arry)){ $value=array_shift($arry); if(array_search($value,$arry)) echo "重複".$value; } ?> <? $arry=Array("x","y","z","x","z","x"); $check=Array(); foreach($arry as $value){ if(isset($check[$value])) echo "重複".$value; else $check[$value]=true; } ?>
- himajin100000
- ベストアンサー率54% (1660/3060)
中々簡潔な手が思いつかず。まぁ途中でキーを登録していってもいいけど、面倒くさそうだからなあ http://ideone.com/jgb2R
- oktuburero
- ベストアンサー率22% (102/446)
>ひとつめのループが最初のaを、ふたつめのループがイコールで、 >ヒットしたものをメッセージで出力します。 >そして、ひとつめのループ最後のaに入った時、もう一度、 >メッセージが表示されてしまうのですが。 アルゴリズムのヒント。 ゲームなんかの総当たりの対戦表や九九(全部ではなくて半分だけで行う方法)
補足
valueとkeyには別の名前が入っていたので、 こちらにのせるため変更したときに、混同してしまいました。 すみません。 例えば、(a,b,c,a)とデータがあった時に、 ひとつめのループが最初のaを、ふたつめのループがイコールで、 ヒットしたものをメッセージで出力します。 そして、ひとつめのループ最後のaに入った時、もう一度、 メッセージが表示されてしまうのですが。