• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:phpで重複チェック)

phpで配列の重複データをチェック〜重複したデータを一回だけ表示する方法〜

このQ&Aのポイント
  • phpの配列で重複データをチェックし、重複したデータを一回だけ表示したい場合、以下のコードを使用します。
  • 配列の要素を順に比較し、重複しているデータがあればカウントします。
  • カウントが2以上の場合、重複データとして表示します。重複したデータが一回だけ表示されます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>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」だけが全角?

junction_7_7
質問者

補足

valueとkeyには別の名前が入っていたので、 こちらにのせるため変更したときに、混同してしまいました。 すみません。 例えば、(a,b,c,a)とデータがあった時に、 ひとつめのループが最初のaを、ふたつめのループがイコールで、 ヒットしたものをメッセージで出力します。 そして、ひとつめのループ最後のaに入った時、もう一度、 メッセージが表示されてしまうのですが。

その他の回答 (5)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.6

よく考えればユニークして差分をとるだけですね <? $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)
回答No.5

修正したら下記のようになります。 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)
回答No.4

重複データが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; } ?>

回答No.3

中々簡潔な手が思いつかず。まぁ途中でキーを登録していってもいいけど、面倒くさそうだからなあ http://ideone.com/jgb2R

回答No.2

>ひとつめのループが最初のaを、ふたつめのループがイコールで、 >ヒットしたものをメッセージで出力します。 >そして、ひとつめのループ最後のaに入った時、もう一度、 >メッセージが表示されてしまうのですが。 アルゴリズムのヒント。 ゲームなんかの総当たりの対戦表や九九(全部ではなくて半分だけで行う方法)

関連するQ&A

専門家に質問してみよう