電子書籍の厳選無料作品が豊富!

phpの重複チェック

phpで配列の重複データをチェックして、重複しているデータを表示しようとしています。
foreach ($arry as $key => $value) {
$err_count = 0;
foreach ($arry as $key => $value2) {
if ($value == $value2) {
$err_count++;
if ($err_count >= 2) {
echo "重複".$value2;
}
}
}
}
としているのですが、
同じモノが2回表示されて困っています。
重複しているデータは一回だけ表示したいのですが、
なにか方法ないでしょうか?

A 回答 (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」だけが全角?

この回答への補足

valueとkeyには別の名前が入っていたので、
こちらにのせるため変更したときに、混同してしまいました。
すみません。

例えば、(a,b,c,a)とデータがあった時に、
ひとつめのループが最初のaを、ふたつめのループがイコールで、
ヒットしたものをメッセージで出力します。
そして、ひとつめのループ最後のaに入った時、もう一度、
メッセージが表示されてしまうのですが。

補足日時:2011/04/16 17:43
    • good
    • 0

よく考えればユニークして差分をとるだけですね



<?
$arry=Array("a","b","a","c","b","a");
$arry2=array_unique(array_diff_assoc($arry,array_unique($arry)));
foreach($arry2 as $val) echo "重複".$val;
?>
    • good
    • 1

修正したら下記のようになります。



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;
 }
}
    • good
    • 0

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

?>
    • good
    • 0

中々簡潔な手が思いつかず。

まぁ途中でキーを登録していってもいいけど、面倒くさそうだからなあ

http://ideone.com/jgb2R
    • good
    • 0

>ひとつめのループが最初のaを、ふたつめのループがイコールで、


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!