sqlのデータを多次元配列に入れた時

このQ&Aのポイント
  • PHPとMySQLの組み合わせでテーブルからデータを取得し、多次元配列に格納したい場合の方法について説明します。
  • テーブル名が「post」で、カラム名が「no」「title」「content」「time」のデータがある場合、下記のSQLを使用してデータを取得し、配列に格納することができます。
  • 配列には、カラム名と配列の番号が同じ値が格納されます。例えば、「no」の値は「$posts[0]['no']」でも「$posts[0][0]」でも取得できます。
回答を見る
  • ベストアンサー

sqlのデータを多次元配列に入れた時

phpとmysqlの組み合わせです。 例えばですがテーブル名「post」に下記のようなカラムがあって(スペースがカラムの区切りです) no title content time 下記のデータが入っている場合 1 記事1のタイトル 記事1の内容 2016/09/01 10:00:00 2 記事2のタイトル 記事2の内容 2016/09/01 10:10:00 これを下記sqlでセレクトして $st = $pdo->query("SELECT * FROM post") 下記で配列に入れて $posts = $st->fetchAll() 内容を表示してソースを見ると print_r($posts) 下記の様になると思うのですが Array (  [0] => Array   (    [no] => 1    [0] => 1    [title] => 記事1タイトル    [1] => 記事1タイトル    [content] => 記事1の内容    [2] => 記事1の内容    [time] => 2016/09/01 10:00:00    [3] => 2016/09/01 10:00:00   )  [1] => Array   (    [no] => 2    [0] => 2    [title] => 記事2タイトル    [1] => 記事2タイトル    [content] => 記事2の内容    [2] => 記事2の内容    [time] => 2016/09/01 10:10:00    [3] => 2016/09/01 10:10:00   ) ) 何故カラム名と配列の番号?の内容が同じものができるのでしょう?

  • tdosj
  • お礼率22% (35/153)
  • MySQL
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

数字の添え字(列番号)でも名前の添え字(列名)でもアクセスできるようにするためでしょう。さすがPHP、サービス精神旺盛だとほめてあげてください。 というのは半分冗談だが、興味があれば http://php.net/manual/ja/pdostatement.fetchall.php http://php.net/manual/ja/pdostatement.fetch.php http://php.net/manual/ja/pdo.setattribute.php ここらあたりを読んでみるといいだろう。 例えばメモリ使用量を減らす目的で列番号だけでいいよという場合は $pdo->query("SELECT * FROM post"); の前に $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_NUM); とすると良い。他にも列名だけにしたりクラスの変数にマッピングしたりなどいろいろあるので試してみると理解が深まるだろう。

tdosj
質問者

お礼

有難うございます。 色々とやりかたがあるんですね。

関連するQ&A

  • 自作PHPブログでの記事を5件ずつ表示する方法に

    自作PHPブログでの記事を5件ずつ表示する方法について PHPで自作のブログをサイト等を参考に制作しているのですが、 最新の記事5件ずつ表示させたい場合はどのような記述をすれば良いのでしょうか? 「前ページ」と「次ページ」的なリンクを貼りたいと思っております。 一番最古の記事のページまで行くと「前ページ」リンクも消えるようにしたいのです。 pager等を検索したのですが、いまいち自分の物に組み込むとなるといまいちよくわからなくなります。 LIMITで5件表示まではわかったのですが、「次へ」で6~10件表示の仕方がわかりませんでした。 どのような記述が良いでしょうか、よろしくお願いします。 <?php $pdo = new PDO("mysql:dbname=blog", "root"); $st = $pdo->query("SELECT * FROM post ORDER BY no DESC LIMIT 5"); $posts = $st->fetchAll(); for ($i = 0; $i < count($posts); $i++) { $st = $pdo->query("SELECT * FROM comment WHERE post_no={$posts[$i]['no']} ORDER BY no DESC"); $posts[$i]['comments'] = $st->fetchAll(); } require 't_index.php'; ?> t_index.phpで表示のプログラムを書いています。

    • 締切済み
    • PHP
  • $PDO->fetchAll()したときに、数字の配列を取り出したい

    お疲れ様です。 いつもお世話になっています。 SELECT A,B,C FROM TABLE $row=$PDO->fetchAll(); var_dump($row); 得られる結果 Array( [A]=>10 [0]=>10 [B]=>8 [1]=>8 [C]=>6 [2]=>6 ) とでてきます。PDO::FETCH_COLUMN,x で1個ずつは取り出せますが、fetchAllで取り出したうえで、key=0,1,2の配列を適当な配列に入れなおしたいです。 できるだけソースがすっきりしたかたちで取り出しをしたいのですが、どのような方法がありますか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列データを置き換える

    こんにちは。お世話になっております。 タイトルにあるように、配列のことでお伺いしたいのですが、 既に存在する配列($array1)と、ポストされた配列($array2)があるとします。 $array1=array("佐藤","田中","鈴木","吉田","加藤","岡田"); $array2=array("佐藤","佐々木","鈴木","吉田","岡田","加藤"); そこで、元の配列をポストされた配列に置き換えるようなものを作りたいのですが(実際は置き換えるというより、配列内を修正という感覚で行っています)、for文を用い配列内のデータ数を繰り返し処理を行いながら、array_splice()などを使いながら、ポストされたデータから元の配列と一致していれば、そのまま新規配列にセット。一致しなければ、ポストされたデータをセット。という具合に行うべきか?と、ソースを記述している段階なのですが、もっと効率のよい方法はないものか?と思い、皆さまにアドバイスいただきたく投函させて頂きました。 上手く説明できずに申し訳ありませんが、ご指導頂戴出来れば幸いです。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • phpのセレクトボックスの配列について

    お世話になっています。 PHPのセレクトボックスの設定でわからないことがあります。 一度質問させていただいたのですが連なる点でわからないとこが出たので質問させていただきます。 不明点は3つあります。 1.セレクトボックスの値を配列で設定する 配列で設定しておけばその配列を複数使用しても参照配列さえメンテすればいいと思うので配列を想定しています 2.配列で設定したときのセレクトボックスの初期値について セレクトボックスの値をベタ書きしている場合は単にselectedすればいいと思うのですが配列の場合厳密なselectedの方法が不明です 3.配列での選択値をPOSTした場合 3つめが最もはまっています以下のソースだと選択値が配列の値が表示されますし、初期値も表示できていますが POSTした値がまともに渡されていません POST先でDB処理を想定しているのですがdate型だとすべて[00:00:00]になってしまいます。 配列を使用しないパターンだと1.2.3全てうまくいくのですがメンテナンスがしづらいので配列で指定したいです 何か、良い方法があればご教授ください //配列の値 $time = array( "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23" ); $minute = array ("00", "15", "30", "45"); for( $a=0; $a < count( $time_array ); $a++){ $selectedStartTime =($time_array[$a] == $start_time[$j])?" selected":""; $startTimeSelectBox .= "\t<option value=\"{$time_array[$a]}\"{$selectedStartTime}>{$time_array[$a]}</option>\n"; } for($a=0; $a < count($minute_array); $a++){ $selectedStartMinute =($start_minute[$j] == $minute_array[$a])?" selected":""; $startMinuteSelectBox .="\<option value=\"{$minute_array[$a]} \"{$selectedStartMinute}>{$minute_array[$a]}</option>\n"; } <td><select name="start_time<?php echo $day ?>" onblur = "func()"> <?php echo $startTimeSelectBox ?> </select> : <select name="start_minute<?php echo $day ?>" onblur = "func()"> <?php echo $startMinuteSelectBox ?> </select> </td> かなり詰まっています。よろしくお願いします。

    • ベストアンサー
    • PHP
  • 2次元配列をスマーティーにうけわたしたい。

    2次元配列を下記のようなソースで処理し、GETで取得したパラメーターと同じならば、スマーティーをつかって、検索フォームに値をわたしたい(次のページにいった時にフォームのチェックボタンなどをチェックしたいとかんがえています。(foreachはつかわないで)単体と複合の配列は、ラジオボタン、一戸建てと大規模のほうはチェックボックスにしたいと考えてます。 現在は、値が表示されない状態です。どうしたらよいでしょうか? //------------検索画面にひとつのパラメーターをわたす機能 $flagbreak=0; foreach($arr_parame as $row){ $i=1; foreach($row as $id => $list){ if( $id2 == $list['url'] ){ //$id2はGETで取得した値 $check_flag = $list['url']; $parame[$id][$check_flag] = '変数に渡す値を記入'; $flagbreak=1; break; } } if($flagbreak == 1)break; } $smarty -> assign("paramelist" , $parame); //smartyのしょり tplでは、{$paramelist.id.url}と書いてます。 ///////////////////////////////////////////////////////// 2次元配列 $arr_parame = array( array( array('no' => 1 , 'url' => 'un', 'title' => '単体'), array('no' => 2 , 'url' => 'com', 'title' => '複合')), array( array('no' => 1 , 'url' => 'ko', 'title' => '一戸建て'), array('no' => 2 , 'url' => 'man', 'title' => '大規模住宅'));

    • 締切済み
    • PHP
  • データの配列

    POSTで送られたデータから配列を作りたいのです。 下記はPOSTのデータをprint_r($_POST)で全て表示していますが、 この中から[NO0~11]までを array([0]=>11 [1]=>6 ~)というような形で配列として表示したので すが、方法が分かりません。 Array ( [N00] => 11 [NAME0] => a [N01] => 6 [NAME1] => b [N02] => 9 [NAME2] => c [N03] => 3 [NAME3] => d [N04] => 12 [NAME4] => e [N05] => 10 [NAME5] => f [N06] => 1 [NAME6] => g [N07] => 5 [NAME7] => h [N08] => 2 [NAME8] => i [N09] => 7 [NAME9] => j [N010] => 4 [NAME10] => k [N011] => 8 [NAME11] => l)

    • 締切済み
    • PHP
  • sqlから多次元配列に要素を格納するコードの書き方

    現在sqlから読み込んだ要素をentries配列に格納しようと考えているのですが、 次のように書いてしまうと長く、複雑になってしまいます。 $res_result = mysql_query( "SELECT * from {$entry_title}", $link ); while( $entry_title = mysql_fetch_assoc( $res_result ) ){}; $res_result = mysql_query( "SELECT * from {$entry_url}", $link ); while( $entry_url = mysql_fetch_assoc( $res_result ) ){}; $res_result = mysql_query( "SELECT * from {$unix_time}", $link ); while( $unix_time = mysql_fetch_assoc( $res_result ) ){}; $res_result = mysql_query( "SELECT * from {$entry_count}", $link ); while( $entry_count = mysql_fetch_assoc( $res_result ) ){}; $entries[$i++] = array( "entry_title" => $entry_title, "entry_url" => $entry_url, "unix_time" => $unix_time, "entry_count" => $entry_count, ); もっと簡潔に書く方法はないでしょうか。 どなたかご教示のほど、どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPの配列

    配列操作で行き詰まったため質問させて頂きます。 ( [0] => Array ( [order] => 39 [time] => 16 ) [1] => Array ( [time] => 17 ) [2] => Array ( [time] => 18 ) [3] => Array ( [time] => 19 ) [4] => Array ( [order] => 39 [time] => 20 ) [5] => Array ( [time] => 21 ) ) 上記のように格納されている配列を下記のように縮めたいと考えています。 ( [0] => Array ( [order] => 39 [time] => 16 ) [1] => Array ( [time] => 17-19 ) [2] => Array ( [order] => 39 [time] => 20 ) [3] => Array ( [time] => 21 ) ) 要は、[order]が無く[time]が2個以上続いている場合、始めの[time]+[-]+最後の[time](order一個手前の)のようにしたいのですが、どのようにすれば良いのか色々考えたのですが行き詰ってしまいました。 どなたかどのようなコードを書けば良いか教えて頂けないでしょうか。 ※始めの配列の並びは例です、毎回配列の中身は違います、もちろん全部[order]が入っている場合もありますし、全部[time]の場合もあります。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • zend_dbについて

    $dbAdapter->setFetchMode(Zend_Db::FETCH_ASSOC); // 取得カラム名配列 $column = array('id', 'title', 'message', "IFNULL(file, 'noimage.jpg') AS file"); // 並び順設定配列 $order = array('id DESC'); // オブジェクト生成 $select = $this->dbAdapter->select() ->from('mtb_feature', $column) ->where('del_flg != ?', 1) ->limit(1) ->order($order); // 抽出を実行 $stmt = $select->query(); // 初期化 $row = array(); // 抽出したデータを取り出す $row = $stmt->fetchAll(); この場合は問題ないのですがfetchAllをfetchRowや他のものにするとエラーになってしまいます。 マニュアルを参照してみたのですが原因がわかりませんでした。fetchAll以外で値を取得したいのですがこの場合どうすればできますでしょうか?

    • ベストアンサー
    • PHP
  • 配列のデータを受け取る、のバグ

    PHPスーパーサンプル第2版の2-3/rcvarray.phpからの抜粋です。 <html> <head> <title>配列のデータを受け取る</title> </head> <body> <?php <?php $array = array("menu"=>"カレー", "price"=>"380", "date"=>"2005/01/01"); echo "配列の内容(エンコードした場合)"; print_r(unserialize(base64_decode($_POST["ar_enc"]))); echo "<p>配列の内容(そのまま渡すと失敗)"; print_r($_POST["ar"]); ?> <form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <input type="submit" value="送信" name="sub1"> <input type="hidden" name="ar" value="<?php echo $array ?>"> <input type="hidden" name="ar_enc" value="<?php echo base64_encode(serialize($array)) ?>"> </form> </body> </html> を実行すると、 配列の内容(エンコードした場合): Notice: Undefined index: ar_enc in /UNIONFS/opt/lampp/htdocs/samples/chapter2/2-3/rcvarray.php on line 14 配列の内容(そのまま渡すと失敗): Notice: Undefined index: ar in /UNIONFS/opt/lampp/htdocs/samples/chapter2/2-3/rcvarray.php on line 16 というエラーが出るんですが、どうやって直せばいいのですか? 正しくは、上には配列の内容が表示され、下にはarrayとだけ表示されるようです。 $arrayの直後に     $ar_enc = "";     $ar = ""; と挿入してみましたがダメでした。 @でエラーを抑制するのはなしでお願いします。

    • ベストアンサー
    • PHP