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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

1回答

2845閲覧

PDOで親子関係の配列を作りたいです

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

1クリップ

投稿2016/04/12 09:35

編集2016/04/12 14:47

下記のような二つのテーブルをジョイントして 親子形式の配列に抽出したいと考えています。
イメージ説明

下記のような配列にしたいです。
data[parent][0][id]=> 1
data[parent][0][name]=> '白鳥 彩華'
data[parent][0][child][0][date]=> 2016-04-01
data[parent][0][child][0][weight]=> 54.3
data[parent][0][child][1][date]=> 2016-04-02
data[parent][0][child][1][weight]=> 57.6
data[parent][0][child][2][date]=> 2016-04-03
data[parent][0][child][2][weight]=> 55.8
以下省略...

「PDO::FETCH_NAMED」で出来そうなんですけど 使い方が解かりません
どなたか教えて下さい 宜しくお願い致します。

追記です...。
とりあえずの解決策として下記のコードで思った通りの配列は組めたんですけど...

php

1$pdo = new PDO(DNS,DBUSER,DBPASS,array(PDO::ATTR_EMULATE_PREPARES => false)); 2$pdo->query('SET NAMES utf8'); 3 4$stmt = $pdo->query(" SELECT * FROM `parent` "); 5 6if($stmt->rowCount() > 0){ 7 $articles = array(); 8 $i=0; 9 while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) { 10 $articles[$i]['id'] = $data['parent_id']; 11 $articles[$i]['name'] = $data['name']; 12 $i++; 13 } 14 $i=0; 15 foreach($articles as $parent){ 16 $id = $parent['id']; 17 $stmt2 = $pdo->query(" SELECT * FROM `child` WHERE `parent_id` = '$id' "); 18 while ($data2 = $stmt2->fetch(PDO::FETCH_ASSOC)) { 19 $articles[$i]['child']['date'][] = $data2['date']; 20 $articles[$i]['child']['weight'][] = $data2['weight']; 21 } 22 $i++; 23 } 24} 25return $articles;

なんか 合理的ではない気がするんです (=ω=。)

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

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

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

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

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

guest

回答1

0

ベストアンサー

SQL でテーブルを結合するといいでしょうね。たとえば、こういうのはどうでしょう。

php

1$sql = <<< SQL 2SELECT 3 `parent`.`parent_id` as `id`, 4 `parent`.`name`, 5 `child`.`date`, 6 `child`.`weight` 7 FROM `child` INNER JOIN `parent` 8 ON `child`.`parent_id` = `parent`.`parent_id`; 9SQL; 10 11$id2index = array(); // id から $argicles での index を引くテーブル 12$articles = array(); 13$stmt = $pdo->query($sql); 14if ($stmt->rowCount() > 0) { 15 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 16 if (array_key_exists($row['id'], $id2index)) { // すでにいる人の場合 17 $index = $id2index[$row['id']]; 18 } else { // 新たに登場した人の場合 19 $id2index[$row['id']] = $index = count($articles); 20 $articles[] = array( 21 'id' => $row['id'], 22 'name' => $row['name'], 23 'child' => array() 24 ); 25 } 26 $articles[$index]['child'][] = array( 27 'date' => $row['date'], 28 'weight' => $row['weight'] 29 ); 30 } 31}

余計なことですが、次のようなコードにして添え字ではなく iddate をキーにした連想配列にしたほうが、よりフラットになってデータが扱いやすいような気がします。

php

1$articles = array(); 2$stmt = $pdo->query($sql); 3if ($stmt->rowCount() > 0) { 4 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 5 if (! array_key_exists($row['id'], $articles)) { 6 $articles[$row['id']] = array( 7 'id' => $row['id'], 8 'name' => $row['name'], 9 'weight' => array() 10 ); 11 } 12 $articles[$row['id']]['weight'][$row['date']] = $row['weight']; 13 } 14}

投稿2016/04/17 12:54

編集2016/04/17 13:03
unau

総合スコア2468

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

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

退会済みユーザー

退会済みユーザー

2016/04/17 14:38

ありがとうございます><;;; こんなINNER JOINの使い方出来るんですね (同じテーブル内でしか使ったことありませんでした..(//∇//)) それに変数をキーに配列を組むなんて思いもつきませんでした.. まだまだ勉強しなきゃいけないことが いっぱいです 今後とも どうそよろしくお願いいたしますm(_ _;)m
unau

2016/04/17 21:16

別テーブルの結合はごくごく普通ですよ、というか、RDBMS において正規化をしていくうえでの基本だと思います。 あと、変数を配列のキーにするのもごくごく普通です。 追記の部分のように、自分なりに考えて書いたコードがあれば、ただの丸投げでなく努力している様子がうかがえますし、コードから理解度や考え方などが見えてきてアドバイスもしやすくなると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問