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回表示されて困っています。
重複しているデータは一回だけ表示したいのですが、
なにか方法ないでしょうか?

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPHP + MySQL で登録時に重複チェックをしたいです。

PHP + MySQL で登録時に重複チェックをしたいです。
DBには
ID Title Name
1 Book1 Author1
2 Book2 Author2
と3000件ほど入っています。これからも増えていく予定です。

このDBにPHPから新たに100件ほどのレコードを一気に登録したいときに、
・Title名が既にDBに登録されている → 何もせずに次へ
・Title名がまだ登録されていない時 → DBへ登録
と、この様な処理をさせたいと考えています。

現状は登録したい値を配列で回し、一つ一つSELECT文で件数チェックをし、0件で有れば登録。0件以外であれば無視。と、している状況です。
ただこれですと、どうしてもサーバーに負担が掛かってしまう気がするのです。

もし、何か他に良い方法がありましたら教えていただけないでしょうか?
よろしくお願いいたします。

Aベストアンサー

他の方法の例として、

DBにて、"Title" をunique keyにして、登録時に、
INSERT IGNORE INTO table_name 構文を使ってINSERT する

では如何でしょう。
Mysqlが、勝手に重複しいれば無視して、重複がなければ登録してくれます

Q連想配列からの値の取り出し

お世話様です。

タイトルにもありますが連想配列を作成した後(以下に記述例)に
その配列からキーを指定して値を取得したいと思っております。
array_keys関数だと値を指定してキーを取得するみたいで
うまくいきませんでした。
何かよい方法ありませんでしょうか?

//配列に格納
while (条件) {
  $aParaOra += array((キー) => (値));
}

Aベストアンサー

解答番号No.1の者です。

ちなみに、キーの指定なしで全部取得するのであれば、
array_values($aParaOra)
で、配列化されたものが返ってきます。

もしくは、以下のようにforeachでループすれば、
キーと値を分離して取得できます。
foreach ($aParaOra as $key => $value) {
# $aParaOra[$key]の値が、$value
}

質問者さんが何をしたいのかがいまいちピンときません。

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?

Q文字列から、特定の文字を削除したい

アンケートで入力された値を受け取り、メールで送信しているのですが、受け取った値から、特定の文字列を削除することは可能でしょうか?

例えば電話番号の入力の場合、
03-xxxx-xxxx →03xxxxxxxx
077-xxx-xxxx →077xxxxxxx
のように、-(ハイフン)が入力されていたら、-を削除した文字列に置換してメール送信したいのです。
入力する時に、3つのテキストエリアに分けるのは諸事情でできないので、特定の文字を削除する関数か処理方法がありましたら、教えていただきたいです。
よろしくお願いします。

Aベストアンサー

str_replace
http://itbtech.itboost.co.jp/man/php_man/function.str-replace.html

<?php
$orig_telno = "03-xxxx-xxxx";

$telno = str_replace("-", "", $orig_telno);
echo $telno;

03xxxxxxxx

“PHP 文字列” あたりをキーワードに検索すれば
そんなに難しいものでもないような。

Qphp ラジオボタンのデータの渡し方

phpで自動販売機プログラムを作成しています。
ラジオボタンを使い120円または150円の飲み物を選択できるようにし、購入を押すとおつりを計算するものです。

これがhtml側のプログラムです。
<FORM ACTION="result.php" METHOD="POST">
<INPUT TYPE="RADIO" NAME="Juice" VALUE="nedan1" CHECKED>120円のジュースを購入します。お金を<INPUT TYPE="TEXT" NAME="money1" SIZE="5">円入れます。<BR>
<INPUT TYPE="RADIO" NAME="Juice" VALUE="nedan2">150円のジュースを購入します。お金を<INPUT TYPE="TEXT" NAME="money2" SIZE="5">円入れます。<BR>

<INPUT TYPE="SUBMIT" VALUE="購入">

これをphp側のプログラムで処理するさいラジオボタンでデータを渡したいのですがやり方がわかりません。
この場合120円の飲み物のおつり計算をしたいのです。
if($_POST['Juice'] = '$nedan1'){(想像)
$sonyu = $_POST['money1'];
こちらでは150円のほうの計算を。
elseif($_POST['Juice'] = '$nedan2'){
$sonyu = $_POST['money2'];
このif文とテキストの渡し方の部分がこれでは動かないのでどなたかご教授ください。

環境はPHPDEV423を使っています。(Apache、Mysql)

phpで自動販売機プログラムを作成しています。
ラジオボタンを使い120円または150円の飲み物を選択できるようにし、購入を押すとおつりを計算するものです。

これがhtml側のプログラムです。
<FORM ACTION="result.php" METHOD="POST">
<INPUT TYPE="RADIO" NAME="Juice" VALUE="nedan1" CHECKED>120円のジュースを購入します。お金を<INPUT TYPE="TEXT" NAME="money1" SIZE="5">円入れます。<BR>
<INPUT TYPE="RADIO" NAME="Juice" VALUE="nedan2">150円のジュースを購入します。お金を<INPUT TYPE="TEXT"...続きを読む

Aベストアンサー

if($_POST['Juice'] = '$nedan1'){(想像)

ラジオボタンは、1つのみ選択ですから $_POST['Juice'] の中に
nedan1かnedan2 という値のどちらかが入ってきます
ですから
比較するのであれば
if($_POST['Juice'] === 'nedan1'){
こうなります

あともうひとつ
実際の自動販売機には、お金を入れるところは1つしかありません。
しかしあなたの質問文に書いているソースを現実に当てはめると、商品毎にコイン投入口があることになります
money1 と money2です
コイン投入口が商品毎に存在する自販機を作るのであれば良いのですが・・・


いちおー私なりに、あなたが理解できるのではないかな?というソースを貼り付けておきますが、
かなりいい加減で、無作法なソースなのでこのままコピーしたりしても意味ないですよ
あくまでもヒントとしてのソースです
この例の場合、同一値段の商品が増えたときに対応できません(わざとです)


---------html
<form action="result.php" method="post">
<input type="radio"name="juice" value="120" />120円のジュースを購入します。 <br />
<input type="radio"name="juice" value="150" />150円のジュースを購入します。 <br />
お金を<inputtype="text" name="money1" size="5" />円入れます。<br />
<input type="submit" value="購入" />
</form>

---------result.php
//陳列している商品の値段と商品名
$price["juice1"]=120;
$price["juice2"]=150;

//POSTされた値を取得します
$juice = $_POST["juice"];
$money1 = $_POST["money1"];

//$money1 がお金かどうかを調べる
if( false === is_int($money1) ){
exit("お金を入れてください");
}

//選択されたジュースがいくらなのかを比較
if ( $price["juice1"] == $juice){
$change = $money1 - $price["juice1"] ;
}elseif( $price["juice2"] == $juice){
$change = $money1 - $price["juice2"];
}

if ( 0 > $change ){
print "お金が足りません";
}else{
print "おつりは".$change."円です";
}

if($_POST['Juice'] = '$nedan1'){(想像)

ラジオボタンは、1つのみ選択ですから $_POST['Juice'] の中に
nedan1かnedan2 という値のどちらかが入ってきます
ですから
比較するのであれば
if($_POST['Juice'] === 'nedan1'){
こうなります

あともうひとつ
実際の自動販売機には、お金を入れるところは1つしかありません。
しかしあなたの質問文に書いているソースを現実に当てはめると、商品毎にコイン投入口があることになります
money1 と money2です
コイン投入口が商品毎に存在する自販機を作...続きを読む

Q宜しくお願いします。

宜しくお願いします。
mix~max値の間、発行したクエリーからの値を配列に入れたいのですが、どうもFor文中にmin,max値は届いているのですが,$resultに値が入りません。
エラーからしてSQLで行っている変数処理に$iの値が届いてない感じがするのですが、下記のソースを見て頂いて、疑わしき点などご指摘、ご教授いただけませんでしょうか。

どうぞ宜しくお願いします。


--エラー文ここから--->
Catchable fatal error: Object of class stdClass could not be converted to string in ...




--ソースここから--->

$min = h($r -> x);
$max = h($s -> y);
for($i=$min ; $i<= $max; $i++){
$search = sprintf("SELECT id FROM Sheet WHERE no='%d'",$i);
$q_search = mysql_query($search);
$result = mysql_fetch_object($q_search);
echo $result;
}

宜しくお願いします。
mix~max値の間、発行したクエリーからの値を配列に入れたいのですが、どうもFor文中にmin,max値は届いているのですが,$resultに値が入りません。
エラーからしてSQLで行っている変数処理に$iの値が届いてない感じがするのですが、下記のソースを見て頂いて、疑わしき点などご指摘、ご教授いただけませんでしょうか。

どうぞ宜しくお願いします。


--エラー文ここから--->
Catchable fatal error: Object of class stdClass could not be converted to string in ...




--ソースここから...続きを読む

Aベストアンサー

PHPあまり詳しくないので間違っていたらすいません。


>$result = mysql_fetch_object($q_search);
でresultはobject型で代入しておりそれを表示するときにString型に変換できていないのが原因かとおもわれます。

参考URL
mysql-query
http://php.net/manual/ja/function.mysql-query.php

mysql-fetch-array
http://php.net/manual/ja/function.mysql-fetch-array.php

mysql_fetch_object
http://phpspot.net/php/man/php/function.mysql-fetch-object.html

QPHPのif文でその処理を途中で抜けるにはどうすればよいでしょうか?

PHPのif文でその処理を途中で抜けるにはどうすればよいでしょうか?
for文やwhile文ではbreakやcontinueなどが使えるようですが、if文にはないのでしょうか?

条件分岐がいくつかあって、その一つを途中で抜けて次の条件分岐へと移行したいのですが、
exitを使ってしまうと、次へ行かずに処理が中止されてしまいますし、
どのようにすればよいのか分からず困っています。何かよい方法はないでしょうか?

Aベストアンサー

例えば「goto 演算子」を使うとかですね。
http://php.net/manual/ja/control-structures.goto.php
(参考URL)

「if文を強制終了」というより「ステップの強制移動」と言った感じです。

ただ、あまりgoto演算子はお勧めできません。
複雑な処理になればなるほど、バグが発生した際にバグ元を発見し難くなります。

本来は細かく制御文を入れていけば、あまり必要ないと思いますが・・・

Q複数のsubmitボタンで押されたボタンを取得する方法

form内の、submitボタンの値が拾えません。
1つだけsubmitボタンを設置すると値が拾えますが、
2つ以上submitボタンを設置すると拾えません。
仕様上、無理なのでしょうか?

<SCRIPT language="JavaScript">
function move_post(){
alert(document.frmMvPost.btn.value);
}
</SCRIPT>

<FORM name="frmMvPost" action="" method="post" onsubmit="return move_post()">
<INPUT type="submit" name="btn" value="テスト1">
<INPUT type="submit" name="btn" value="テスト2">
<INPUT type="submit" name="btn" value="テスト3">
</form>

Aベストアンサー

> alert(document.frmMvPost.btn.value);

btnというオブジェクトが複数あるため、btnは配列になってしまうため、
document.frmMvPost.btn.valueでは値が取れません。

回避策はonClickイベントにて値をHiddenへ格納すればOKです。

_____________________________________________________________

<SCRIPT language="JavaScript">
function move_post(){
alert(document.frmMvPost.onbtn.value);
}

function set_value(s_val)
{
document.frmMvPost.onbtn.value = s_val;
}

</SCRIPT>

<FORM name="frmMvPost" action="" method="post" onsubmit="return move_post()">
<INPUT type="submit" name="btn" value="テスト1" onClick="set_value('テスト1')">
<INPUT type="submit" name="btn" value="テスト2" onClick="set_value('テスト2')">
<INPUT type="submit" name="btn" value="テスト3" onClick="set_value('テスト3')">
<INPUT type="hidden" name="onbtn">
</form>

_____________________________________________________________


※テストしていないため動作は保証しません。問題ある場合にはお手数ですが何かしら手を加えてください。

> alert(document.frmMvPost.btn.value);

btnというオブジェクトが複数あるため、btnは配列になってしまうため、
document.frmMvPost.btn.valueでは値が取れません。

回避策はonClickイベントにて値をHiddenへ格納すればOKです。

_____________________________________________________________

<SCRIPT language="JavaScript">
function move_post(){
alert(document.frmMvPost.onbtn.value);
}

function set_value(s_val)
{
document.frmMvPost.onbtn.value = s_val;
}

</SCRIPT...続きを読む

Qで配列(複数の要素)を渡したいとき?

こんにちわ,

今HTML+PHPで
$hoge[]にいくつかの要素が入っているとき,
それをあるfoo.phpというページに渡したいとき,
echo '<form action="foo.php" method="POST">';
echo '<input type="hidden" name="$hoge[]" >';
echo '</form>';
としたのですが,うまくいきません。

どうしたらよろしいでしょうか。

Aベストアンサー

nameじゃなく、valueでは?
あとやるなら、
for($i=0;$i<count($hoge);$i++){
print "<input type=\"hidden\" name=\"$hoge[$i][0]\" value=\"$hoge[$i][1]\">";
}
とか?

Qなぜ、unexpected T_VARIABLEになるのでしょうか? 

WindowsXP機に、PHP5とPEARを入れています。
あるWebサイトに記述されている下記のサンプルスクリプトをコピペして(PEARは絶対パスに書き換えて)実行しましたが、次のエラーが出ます。全角スペースは入っていませんし、原因が分かりません。
なぜ、unexpected T_VARIABLEになるのでしょうか? どのようにすれば解決できるでしょうか?
エラー
Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in C:\Program Files\Apache Group\Apache2\htdocs\HQuickForm_test\QfrmSmpl.php on line 14

サンプルスクリプト一部抜粋:
<?php
require_once("C:\php\PEAR\HTML\QuickForm.php");
class QfrmSmpl{
var $_form;
function QfrmSmpl($sbmtAct){
$this -> _form = new HTML_QuickForm("frmSmpl","post",$sbmtAct); }
function setForm(){
$this -> _form -> addElement("text","txtName","名前(全角日本字):");
$this -> _form -> addElement("text","txtEname","名前(半角英字):");
$this -> _form -> addElement("text","txtEmail","E-mail:");
$this -> _form -> addElement("text","txtEmail2","E-mail(確認用):");
$this -> _form -> addElement("textarea","txtrComment","コメント:");
}
$this -> _form -> applyFilter(__ALL__,"trim");
$this -> _form -> addRule("txtName","名前を入力!","required", null, "client");
$this -> _form -> addRule("txtEname","半角英字で入力!","alphanumeric", null, "client");
$this -> _form -> addRule(array("txtEmail","txtEmail2"),"メールアドレス不一致!","compare", null, "client");
$this -> _form -> addRule("txtEmail","無効なメールアドレス!","email", null, "client");
$this -> _form -> addRule("txtrComment","コメントを入力!","required", null, "client");
$this -> _form -> setRequiredNote("<font color='red'>*</font>必須入力");
}
以下略

WindowsXP機に、PHP5とPEARを入れています。
あるWebサイトに記述されている下記のサンプルスクリプトをコピペして(PEARは絶対パスに書き換えて)実行しましたが、次のエラーが出ます。全角スペースは入っていませんし、原因が分かりません。
なぜ、unexpected T_VARIABLEになるのでしょうか? どのようにすれば解決できるでしょうか?
エラー
Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in C:\Program Files\Apache Group\Apache2\htdocs\HQuickForm_test\QfrmSmpl.php...続きを読む

Aベストアンサー

検索したら似たようなスクリプトがあったんですが
http://digit-01.com/ownpage/ownpage_quickform.html
これの
//フォーム入力チェックの定義(, null, "client")で、クライアント側でチェック function checForm(){
は function checForm(){ の前で改行が必要なようです


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報