質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

11575閲覧

PHPのループ内の条件分岐による配列の比較

flat

総合スコア617

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/05/31 14:58

編集2015/05/31 15:07

ループ内の条件分岐で一致した条件の項目と一致しなかった項目を分けたくて次の様にしています。
しかし、求める表示結果とは異なってしまいます。
ループをネストしているからだとは思うのですが、どうなっているのか理屈がいまいちよく分からず…。
よろしければ求める表示結果を得る方法と、下記コードがどう間違えているのかの解説を頂けないでしょうか…。
尚、どちらも比較しているのは文字列です。

lang

1foreach ( $items as $item ) { // 連想配列を持つオブジェクトが複数格納された配列 2 foreach ( $key as $value ) { // 連想配列 3 if ( $item -> name == $value ) { // name と $value が一致した時は次を表示 4 echo '<li>Success: ' . $item -> name . '</li>'; 5 } else { // 一致しない時は次を表示 6 echo '<li>Fail: ' . $item -> name . '</li>'; 7 } 8 } 9}

求める表示結果

  • Success: A
  • Success: B
  • Fail: C

実際の表示結果

  • Success: A
  • Fail: A
  • Fail: B
  • Success: B
  • Fail: C
  • Fail: C

ちなみに次の様にした時は意図した通りの結果になりますが、複数の値に対応出来ません

lang

1foreach ( $items as $item ) { // 連想配列を持つオブジェクトが複数格納された配列 2 if ( $item -> name == $key[0] ) { // name と $value が一致した時は次を表示 3 echo '<li>Success: ' . $item -> name . '</li>'; 4 } else { // 一致しない時は次を表示 5 echo '<li>Fail: ' . $item -> name . '</li>'; 6 } 7}

表示結果

  • Success: A // 最初に一致した項目だけSuccess
  • Fail: B
  • Fail: C

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

単純に下記のようにしてはだめなんでしょうか

lang

1foreach($items as $item){ 2 if(in_array($item->name, $key)){ 3 echo '<li>Success: ' . $item->name . '</li>' . "\n"; 4 }else{ 5 echo '<li>Fail: ' . $item->name . '</li>' . "\n"; 6 } 7}

$keyの要素数が多ければ下記

lang

1$key = array_flip($key); 2foreach($items as $item){ 3 if(isset($key[$item->name])){ 4 echo '<li>Success: ' . $item->name . '</li>' . "\n"; 5 }else{ 6 echo '<li>Fail: ' . $item->name . '</li>' . "\n"; 7 } 8}

投稿2015/06/01 07:34

yokoyam49

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

flat

2015/06/01 09:16

回答して下さりありがとうございます。 どちらもシンプルで分かりやすいですね。 ちなみに後者は「配列に値があるかどうか」をチェックするよりも「反転した$keyの配列にあるキーに同名のnameがあるかどうか」でチェックする方が要素が多い時には速いという理解で良いのでしょうか?
yokoyam49

2015/06/02 00:19

はい。 in_arrayは要素を走査していくので、要素数が多い場合は遅くなっていきます。 キーと値を反転してダイレクトにissetで存在するか確認したほうが速い…はずです。 大量のデータから判定する、もしくは判定する可能性がある場合はissetの方がよいと思います。
flat

2015/06/05 05:48

お返事が遅くなりました…。 こちらの質問にも答えて下さりありがとうございます。 大事な知識の一つとして頭に入れておきます。
guest

0

ベストアンサー

データが何なのか不明なのでよくわかりませんが、こんな感じでしょうか?

lang

1foreach ( $items as $item ) { // 連想配列を持つオブジェクトが複数格納された配列 2 $flat = false; 3 foreach ( $key as $value ) { // 連想配列 4 if ( $item -> name === $value ) { 5 $flag = true; 6 break; 7 } 8 } 9 if ( $flag ) { // name と $value が一致した時は次を表示 10 echo '<li>Success: ' . $item -> name . '</li>'; 11 } else { // 一致しない時は次を表示 12 echo '<li>Fail: ' . $item -> name . '</li>'; 13 } 14}

投稿2015/05/31 15:16

otn

総合スコア84489

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

flat

2015/05/31 15:40

その様に処理を振り分けたら良いのですね。 試してみたところ求めた通りの結果が得られました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問