回答編集履歴

1 加筆修正

m6u

m6u score 12438

2017/03/15 19:17  投稿

PHPにおける「配列」とは何か。
[PHP: 配列 - Manual](http://php.net/manual/ja/language.types.array.php)
他の言語で実現しているデータ構造のいいとこ取り(?)みたいなことをやってます。
C言語ライクに0, 1, 2, ...といった添字で値を格納するだけではなく、
Perlなどで言う連想配列(キーに任意の文字列を指定して値を格納する)こともできますし、
その際キーは辞書順である必要もなく記述した順番通り順序も記憶してくれる
ちょー便利な仕組みなんです。
[PHP: PDOStatement::fetch - Manual](http://php.net/manual/ja/pdostatement.fetch.php)
の説明では「結果セットに 返された際のカラム名で添字を付けた配列を返します」とあるので、
SELECT文の実行結果での、カラム名(あるいはフィールド名とも言いますか)を
配列のキー文字列として使って値を格納した配列を返す、
という意味です。
`'select * from customer where login=? and password=?'`っていうSELECT文の実行結果が
`'select id, login, password, name, address from customer where login=? and password=?'`っていうSELECT文の実行結果のように
1行ごとに配列として
```
$row = array(
 'id' => (idの値),
 'login' => (loginの値),
 'password' => (passwordの値),
 'name' => (nameの値),
 'address' => (addressの値)
);
```
として配列で返すということです。
`while ( $row = $stmt->fetch ( PDO::FETCH_ASSOC) ) {`  
だから、結果は$row['id'], $row['login'], $row['password']で受け取ることになります。  
(このときの$rowは配列。)  
 
`while ( $row = $stmt->fetch ( PDO::FETCH_NUM ) ) {`
としてしまうと、結果は$row[0], $row[1], $row[2]で受け取ることになります。
(このときも$rowは配列。)  
`while ( $row = $stmt->fetch ( PDO::FETCH_OBJ ) ) {`
としてしまうと、結果は$row->id, $row->login, $row->passwordで受け取ることになります。
(このときの$rowは無名オブジェクトのインスタンス。)無名というか匿名というか、、  
もしもテーブルcustomerの構造が変わってしまってカラム名の順番が変わってしまったとしても、
PDO::FETCH_ASSOCやPDO::FETCH_OBJを指定していれば
カラム名を直接指定して読み出せるため、
テーブルの構造の変化に強いプログラミングになります。
あとはどっちのスタイルが好きかでいいんじゃないでしょうか。
(パフォーマンスの違いがあるのかないのかはわかりません、、)

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る