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

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

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

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

PHP

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

Q&A

解決済

6回答

2086閲覧

while文の条件式に=演算子が使える理由

Shinkanchouu

総合スコア1

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

PHP

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

0グッド

3クリップ

投稿2021/03/15 18:20

#while文の条件式に=演算子が使える理由

比較演算子がなく、=の代入演算子のみで上構成されているwhile文を使いましたが理由がわかりません

PHPでmysqliを使用してデータベースを触っています。
mysqliとはあまり関係ありませんが、以下の時の、while文でなぜ=演算子によってwhile文が成立するのかが知りたいです。
不都合と緊急性はありませんが、モヤモヤするので知っているかた是非教えてください

php

1// クエリ文を作って 2$sql = "クエリ文"; 3 4// 実行して 5$res = $mysqli->query($sql); 6 7// 連想配列に直す 8$data = array(); 9while ($row = $res->fetch_assoc()) { 10 $data[] = $row; 11}

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

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

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

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

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

m.ts10806

2021/03/15 22:28 編集

「式だから」ではいけませんか? これも式です。 if($a="test")
guest

回答6

0

ベストアンサー

正しく動作はするけど個人的には好みじゃないですね。

さて、以下のコードで分かるように…

php

1$a = $b = 1; 2echo '$a = ' . $a . "\n"; 3echo '$b = ' . $b . "\n";

代入結果は伝搬するんスね。
あと、評価は基本的に true か false なんスけど、それ以外のものが与えられた場合はどちらかに(無理やり)変換されちゃうんス。

そういう(ある意味)ダーティな規則を用いると短いコードが書けちゃったりしますが、それよりもっと分かりやすいコードがいいんじゃないかなあ。

投稿2021/03/16 11:40

編集2021/03/16 11:42
takasima20

総合スコア7458

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

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

Shinkanchouu

2021/03/21 13:17

なるほど、動的型付けの言語だと無理やり真偽地に直すんですね。 納得です!! ありがとうございました!
guest

0

回答ではないです。while ($row = $res->fetch_assoc())という書き方がキライなので書きます!

基本的に php の条件式の中に代入演算子を混ぜなければならないケースはありません。
(ごく僅かに存在しますが、初学者ほど知らなくてよいケースです)

本件では、$resというmysqli_resultつまり結果セットからループ毎に結果の行を連想配列で取得する操作をしていますが、結果セットはforeachでほぼ同様のことが実現可能です。

mysqli_result::fetch_assoc

例2 mysqli_result, iterator, mysqli_result::fetch_assoc() の使い方の比較

mysqli_result は、foreach を使って繰り返し処理をすることができます。 結果セットは、現在の位置に関わらず、最初の行から処理されます。

こちらがオススメです。

php

1$result = $mysqli->query($query); 2foreach ($result as $row) { 3 printf("%s (%s)\n", $row["Name"], $row["CountryCode"]); 4}

追記
ちょっとキライの根拠を補足しますね。

条件式に代入演算子を交えると、比較演算子のタイポが疑われます。
==,===を間違っちゃったんじゃないの?ってやつです。
syntax error にならないので、緩いテストだと通ってしまう事もあり、見かけるたびに「検証しなくては!」という義務感にかられる人も多いです。
また、この手のタイポ予測はチェックツールで監視している人も多く(現場のコーディング規約次第ですが)可能な限り使用をさけるのが良いです。

条件式に代入演算子の使用を許容するために「ヨーダ」とか言い出す人がいると最悪ですw

投稿2021/03/24 02:46

編集2021/03/24 06:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

=か使えるのは「式」として成立するからです。

whileの「()」は、ループ内のコード実行するかどうかの条件式を書きますよね。

条件式がtrueの時は実行する、falseの時は実行しない、です。

比較演算子も、条件満たしてたらtrue、条件満たさない時はfalseを返してます。

$row = $res->fetch_assoc()も同じようにtrue,falseで判別されます。

$res->fetch_assoc()は値がある場合は、$rowに代入され、その$rowは値が入っているのでtrueとなります。

$res->fetch_assoc()の最後は値がなくなり、nullを返します。$rowにnullが代入されるのですが、nullの入った$rowはfalseとなります。ここでwhileループは終了します。

条件式・ループ回数としては

while ($row = $res->fetch_assoc()) {

while ( $res->fetch_assoc()) {

どちらも同じで同じ回数ループしますが、$res->fetch_assoc()の戻り値をループで使うので$row = $res->fetch_assoc()とまとめてしまっている、ですかね。

投稿2021/03/16 00:40

hiok

総合スコア590

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

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

Shinkanchouu

2021/03/21 13:18

ありがとうございます! 丁寧な説明のおかげでしっかり理解できました!
guest

0

代入式の値は代入された値と同じです。$a=123ならこの式が返す値は123です。

したがってwhile($row = $res->fetch_assoc()){は、条件判定としてはwhile($res->fetch_assoc()){と同じです。これに$rowへの代入というおまけが付いているということです。

こういう書法を知っているとコードを短くできるという利点があります。慣れないうちは危険なので無理やり真似る必要はありませんが、こういうやり方もあると頭の片隅に入れておくといいです。

投稿2021/03/15 18:57

KojiDoi

総合スコア13671

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

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

Shinkanchouu

2021/03/21 13:20

代入された値で判定して更にループ内で値を使用できる一石二鳥なやり方があるんですね!! 頭の片隅に置いておきます! ありがとうございました!!!
guest

0

これは、Perl言語におけるDBアクセスのイディオムに由来する書き方です。

PHPが普及するまで、Webアプリケーションでもっとも普及していた言語がPerlだったので、PHPはPerl言語の慣習を多くとりこんでいます。この書き方もそうです。

そして、PerlはC言語やsed、AWKなどの影響を受けています。C言語のイディオムでは、whileループの条件式に代入を用いることがよくあったので、PerlのDBアクセスのイディオムもその影響を受けています。

要は、その当時のプログラマーにとっては親しみのある書き方だった、ということですね。

投稿2021/03/23 23:40

chokojori

総合スコア971

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

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

0

代入式の場合左辺の変数の値と右辺の式の値が等価になります
そのため
Whileのループ判定は左辺で行っても右辺で行っても等価となります。
したがって
右辺の式評価の結果を持ってループをしても
変数の値でループをしても
結果が等価になることを、処理系に指示することができるからです
逆にこれが嫌な場合は
代入を先に行い
値のみで明示的にループ判定をせよと記述するなり dowhileを使うなどして逆の処理が必要になります。
式でループするか値でループするかは意味論といえば意味論なのですが厳密にはことなるため
そういう仕様でありPHPはその仕様を引き継いでいるからです

投稿2021/03/24 00:04

kokorohamoe

総合スコア190

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問