• 締切済み

mysqlから取得した配列をカンマで分割して配列に

mysqlに登録されたデータを添字配列で受け取り、配列の中のデータを区切り文字で分割して 新たな配列を作りたいのですが、どのようにすれば良いでしょうか? テーブル名:tableA |s_date|staff_id|   cell01  |cell02|~|   cell200   | ├──-┼───-┼──────┼──-┼─┼───────┤ |08-04|  002 |10:35,会議室,1| -  |~|19:40,フロアB,3 | ├──-┼───-┼──────┼──-┼─┼───────┤ テーブル名:tableB |staff_num|staff_name| 所属 | ├────┼────-┼───┤ |  002  | A山A男 |A支店 | ├────┼────-┼───┤ $sql = "SELECT * FROM tableA JOIN tableB ON tableA.staff_id = tableB.staff_num WHERE s_date = '$today' "; $rst = mysql_query($sql , $con); if($rst){ while($col = mysql_fetch_row($rst)){ cell01~cell200の結果を順番に出力したいので$col[15]と、添え字で取り出せる様にmysql_fetch_rowにしました。 for ($i = 2, $max = count($col); $i< $max - 3; $i++){ echo'<dd>'.$col[$i].'</dd>'."\n"; このままだと出力結果は下記になりますが <dd>10:35,会議室,1</dd> $col[$i]の中身をカンマで分割して利用したいと思っています。 $col[0][time] → 10:30   $col[200][time] → 19:40 $col[0][place] → 会議室   $col[200][place] → フロアB $col[0][flag] → 1      $col[200][flag] → 3 echo'<dd class="style'.$col[$i][flag].'">場所:'.$col[$i][time].'開始時間:'.$col[$i][time].'</dd>'."\n"; この様な感じで出力されるのが理想です。 <dd class="style1">場所:会議室 開始時間:10:35</dd> 違う書き方でも結果が同じであれば、それでも構いません。 少しでもアドバイスをいただければ助かります。よろしくお願い致します。

  • PHP
  • 回答数6
  • ありがとう数1

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.6

データの持ち方がよくないように感じます こんな感じでデータを持てばよいのでは? create table tableA(s_date date,staff_id int,cell int,jikan time,basho varchar(30),flag int,unique(s_date,staff_id,cell)); insert into tableA values ('2013-08-04',2,1,'10:35','会議室',1) ,('2013-08-04',2,200,'19:40','フロアB',3) ,('2013-08-04',3,1,'10:40','フロアB',2) ,('2013-08-04',3,200,'19:40','フロアA',1) ,('2013-08-05',2,1,'10:20','会議室',1); これを一覧で得るのであればこんな感じ? select s_date,staff_id ,group_concat(if(cell=1,txt,null)) as cell001 ,group_concat(if(cell=2,txt,null)) as cell002 ・・・ ,group_concat(if(cell=200,txt,null)) as cell200 from( select s_date,staff_id,cell,concat(hour(jikan),':',minute(jikan),',',basho,',',flag) as txt from tableA ) sub group by s_date,staff_id

noname#244856
noname#244856
回答No.5

訂正(何度もすみません) ____switch (true) { ________case !isset($_REQUEST['date']): ________case !is_string($date = $_REQUEST['date']): ____________throw new Exception('日付を指定してください'); ________case !($link = @mysql_connect('localhost', $dbuser, $dbpass)): ____________throw new Exception('MySQL接続失敗'); ________case !mysql_select_db($dbname, $link): ________case !mysql_set_charset('utf8', $link): ________case !($result = mysql_query(sprintf($sql, mysql_real_escape_string($date, $link)), $link)): ____________throw new Exception(mysql_error($link)); ____} mysql_connectに失敗したときはmysql_errorは使えないのでこうするしかないです。

noname#244856
noname#244856
回答No.4

mysql関数を使えば早く書けるとか全然そんなことありませんが・・・ mysql関数バージョン http://ideone.com/lxE1bl <?php try { ____ ____$dbname = ''; ____$dbuser = ''; ____$dbpass = ''; ____$sql = 'SELECT * FROM tableA JOIN tableB ON tableA.staff_id = tableB.staff_num WHERE s_date = %s'; ____ ____switch (true) { ________case !isset($_REQUEST['date']): ________case !is_string($date = $_REQUEST['date']): ____________throw new Exception('日付を指定してください'); ________case !($link = @mysql_connect('localhost', $dbuser, $dbpass)): ________case !mysql_select_db($dbname, $link): ________case !mysql_set_charset('utf8', $link): ________case !($result = mysql_query(sprintf($sql, mysql_real_escape_string($date, $link)), $link)): ____________throw new Exception(mysql_error($link)); ____} ____ ____$rows = array(); ____while ($tmp = mysql_fetch_assoc($result)) { ________$rows[] = $tmp; ____} ____array_walk_recursive($rows, function (&$v, $k) { ________if (strpos($k, 'cell') !== 0) { ____________return; ________} ________$values = explode(',', $v, 3); ________if (!isset($values[2])) { ____________$values = array_fill(0, 3, '-'); ________} ________$keys = array('time', 'place', 'flag'); ________$v = array_combine($keys, $values); ____}); ____ } catch (Exception $e) { ____ ____$error = htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8'); ____ } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Test</title> </head> <body> <?php if (isset($error)): ?> <p><?=$error?></p> <?php elseif (!$rows): ?> <p>データが見つかりませんでした</p> <?php else: ?> <?php foreach ($rows as $row): ?> <table border> <caption><?=$row['staff_name']?>(<?=$row['s_date']?>)</caption> <tr> <th>場所</th> <th>開始時間</th> </tr> <?php foreach (array_slice($row, 2, -3) as $r): ?> <?php if ($r['time'] === '-') { continue; }?> <tr class="style<?=$r['flag']?>"> <td><?=$r['place']?></td> <td><?=$r['time']?></td> </tr> <?php endforeach; ?> </table> <?php endforeach; ?> <?php endif; ?> </body> </html>

nekocue
質問者

補足

何度も有難うございます! 質問用に簡略化したソースを提示しましたが、他の部分もかなり量があるので、PDOの使い方を調べながら書く時間が無いのです。すみません。 今まであまりforeachは使ってなかったので思いつきませんでした。これから回答を参考に書き直してみます。有難うございました。

回答No.3
nekocue
質問者

補足

if($shop){ list($s_name,$s_add,$s_tell) = explode(':', $shop); } 今まで↑のような感じで使っていましたが、今回はフィールド数が膨大でcell01~cell200まで200個あります。 中に入るデータ形式は同じなので、纏めて分割する方法が知りたいのです。

noname#244856
noname#244856
回答No.2

【訂正】 http://ideone.com/z0qcAt <?php try { ____ ____switch (true) { ________case !isset($_REQUEST['date']): ________case !is_string($date = $_REQUEST['date']): ____________throw new Exception('日付を指定してください'); ____} ____ ____$dbname = ''; ____$dbuser = ''; ____$dbpass = ''; ____ ____$pdo = new PDO("mysql:dbname={$dbname};host=localhost;charset=utf8", $dbuser, $dbpass); ____$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); ____ ____$sql = 'SELECT * FROM tableA JOIN tableB ON tableA.staff_id = tableB.staff_num WHERE s_date = ?'; ____$stmt = $pdo->prepare($sql); ____$stmt->execute(array($date)); ____$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); ____array_walk_recursive($rows, function (&$v, $k) { ________if (strpos($k, 'cell') !== 0) { ____________return; ________} ________$values = explode(',', $v, 3); ________if (!isset($values[2])) { ____________$values = array_fill(0, 3, '-'); ________} ________$keys = array('time', 'place', 'flag'); ________$v = array_combine($keys, $values); ____}); ____ } catch (Exception $e) { ____ ____$error = htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8'); ____ } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Test</title> </head> <body> <?php if (isset($error)): ?> <p><?=$error?></p> <?php elseif (!$rows): ?> <p>データが見つかりませんでした</p> <?php else: ?> <?php foreach ($rows as $row): ?> <table border> <caption><?=$row['staff_name']?>(<?=$row['s_date']?>)</caption> <tr> <th>場所</th> <th>開始時間</th> </tr> <?php foreach (array_slice($row, 2, -3) as $r): ?> <?php if ($r['time'] === '-') { continue; }?> <tr class="style<?=$r['flag']?>"> <td><?=$r['place']?></td> <td><?=$r['time']?></td> </tr> <?php endforeach; ?> </table> <?php endforeach; ?> <?php endif; ?> </body> </html> 【動作テスト】 http://ideone.com/CCdqen

noname#244856
noname#244856
回答No.1

・もう非推奨のmysql関数を使うのはやめましょう。PDOを推奨します。 ・JOINしてるのにtableBのデータを利用するコードが見当たりませんが、他で使うものとして考えます。 ・PHPバージョン5.4以上と仮定します。 http://ideone.com/th1lRa <?php try { ____ ____switch (true) { ________case !isset($_REQUEST['date']): ________case !is_string($date = $_REQUEST['date']): ____________throw new Exception('日付を指定してください'); ____} ____ ____$dbname = ''; ____$dbuser = ''; ____$dbpass = ''; ____ ____$pdo = new PDO("mysql:dbname={$dbname};host=localhost;charset=utf8", $dbuser, $dbpass); ____$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); ____ ____$sql = 'SELECT * FROM tableA JOIN tableB ON tableA.staff_id = tableB.staff_num WHERE s_date = ?'; ____$stmt = $pdo->prepare($sql); ____$stmt->execute(array($date)); ____$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); ____ ____array_walk_recursive($rows, function (&$v, $k) { ________if (strpos($k, 'cell') !== 0) { ____________return; ________} ________$values = explode(',', $v, 3); ________$keys = array('time', 'place', 'flag'); ________$v = array_combine($keys, $values); ____}); ____ } catch (Exception $e) { ____ ____$error = htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8'); ____ } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Test</title> </head> <body> <?php if (isset($error)): ?> <p><?=$error?></p> <?php elseif (!$rows): ?> <p>データが見つかりませんでした</p> <?php else: ?> <table> <?php foreach ($rows as $r): ?> <tr class="style<?=$r['flag']?>">場所:<?=$r['place']?> 開始時間<?=$r['time']?></tr> <?php endforeach; ?> </table> <?php endif; ?> </body> </html>

nekocue
質問者

お礼

有難うございます。 PDOを使うべきなのは存じてますが、今回はとにかく早く作るようにせっつかれていますので取り敢えずmysql関数でいく予定です。 いずれはPDOで書き直さなければならないので、その際に参考にさせていただきます。

関連するQ&A

  • 配列をmysqlに保存

    チェックボックスで複数選択されたチェックボックスの値を配列としてmysqlに保存したいのですがどうも上手くいきません。いろいろweb上で探してみましたが、serialize/unserialize関数?を使うのでしょうか?ちなみに抽出も上手くいきません。どなたか教えていただけませんか?宜しくお願いします。以下スクリプトの一部です。 //配列 <input type='checkbox' name='op[]' value='ac'>ac <input type='checkbox' name='op[]' value='pw'>pw <input type='checkbox' name='op[]' value='cd'>cd //データベースに登録 $sql="insert into test (test) values (\"$op\")"; mysql_query($sql,$con); //データベースから配列として抽出 $sql = "select * from op"; $rst = mysql_query($sql,$con); $col = mysql_fetch_array($rst); $op = $col[op];

    • ベストアンサー
    • PHP
  • [php]mysqlデータ配列取得について

    お世話になります。検索しても中々辿り着けなかったので質問させていただきます。 途中から //mysqlより全データ検索 $result = mysql_query('SELECT id FROM hoge ORDER BY id'); //添字配列として全データ取得   while($row = mysql_fetch_row($result)){ //ここの処理で$rowの配列を一行の配列として足していきたい。 var_dump($row); print('<br />');   } 現在の出力内容は array(1) { [0]=> string(1) "5" } array(1) { [0]=> string(1) "6" } array(1) { [0]=> string(1) "7" } array(1) { [0]=> string(1) "8" } こうした形で出力されます。 理想の出力内容は各arrayを足して、 array(4) { [0]=> string(1) "5" [1]=> string(1) "6" [2]=> string(1) "7" [3]=> string(1) "8"} 一行として出力したいのですが、一向にできる気配がありません。 初歩的なものだと思いますが、とても困ってます。何卒よろしくお願いいたしますm(_ _)m

    • ベストアンサー
    • PHP
  • 連想配列内の文字列を結合できませんか

    連想配列?の$col[""]内の文字列を結合することはできませんか. PHP4とMySQL 4.0の組み合わせでアンケートページを作ります. 質問1 が 1.phpに($pageid=1;) 質問2 が 2.phpに($pageid=2;) 質問3 が 3.phpに($pageid=3;) 質問4 が 4.phpに($pageid=4;) 質問5 が 5.phpに($pageid=5;) それぞれあります. これに対応して,回答を格納するDBも,CHAR(1)でAns1~Ans5まであります.ここで, $pageid=1; $rst = mysql_query($sql, $con); $col = mysql_fetch_array( $rst); ${"Answer" . $pageid} = $col["Ans" . $pageid]; echo $Answer1; みたいに,連想配列名を変数で指定するような強引技はできないのでしょうか? http://oshiete1.goo.ne.jp/qa2706401.html で同じような質問を 一旦は取り下げたのですが,やっぱり実現したいです.

    • ベストアンサー
    • PHP
  • MySQL→PHP→JSONをしたいのですが…

    現在、MySQLから取得したID一覧をJSON形式で出力したいのですが、うまくいきません。どうしたらよいでしょうか?よろしくお願いします。 なお、PHPでは以下のような処理をおこなっています。 ///////////////////////////////////////////////////////////////////// ・ ・ ・ //SQLを発行して結果セットを取得します $rst = mysql_query($sql); while ($col = mysql_fetch_array($rst)) { $return[] = $col; } function get_id($f) { return $f["dataid"]; } $return = array_map( "get_id", $return ); // JSON形式にして返す if( $return ) print Jsphon::encode( $return ); ・ ・ ・//////////////////////////////////////////////////////////////////// このようなかんじです。 この出力結果は『 ["18","19","20"] 』このようになるのでJSONでうまく処理できていないようです。 JSON形式なら『 {"dataid":"18","dataid":"19","dataid":"20"} 』 になるはずなのですが…何故でしょうか?教ええてください。お願いします。

    • ベストアンサー
    • PHP
  • 配列をWHEREで検索できますか。

    こんにちは。私はMysql4.1,PHP5を使用しています。 いまチェックボックスを使った配列の検索で悩んでおりました。 <input type="checkbox" name="chiiki[]" value="1">北海道 <input type="checkbox" name="chiiki[]" value="2">青森県 という形でhtmlからPOSTで値を受けとり検索したいと考えています。 テーブルには ---------------- chiiki ---------------- 1,2,4 というように配列で登録しています。 http://oshiete.nikkeibp.co.jp/kotaeru.php3?q=1496449 を参考にさせていただいたのですが、結果がうけとれません。 今まで配列を処理するときは while($col = mysql_fetch_array($rst)){ $chiiki = split(",",$col['chiiki']); } としていましたが、これは結果の値を受け取ったあとなので whereを使って配列と一致させる方法がわかりません。 どなたかご教授いただけないでしょうか。よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 一行目のレコードを2度表示させたい。

    レコードを読み込むのとは別に、最終書き込み者(ソートした最初のレコード)を表示させたいのですが、mysql_fetch_array($rst)を読み込ませると1位行目が消え、次ぎにmysql_fetch_array($rst)が読み込む時には2行目からになります。 ------------------------- 最終書き込み者 一太郎さん「一番目のタイトル」 -レコードの一覧- □一太郎 一番目タイトル □次郎  2番目のタイトル □佐武郎 三番目のタイトル ------------------------- としたいのですが。 SQLを2度実行すればできるのですが、無駄な処理な気もします。 別のテーブルやこの情報だけtextに保存するのも無駄な気もするし。 //一番目をゲット $sql = "select * from siritori order by db_no desc limit 1;"; $rst = mysql_query($sql,$con); //$rst2 = $rst; $col = mysql_fetch_array($rst); print "最終書き込み者".$col["name"]."さん".$col["title"]."<hr>"; //一覧を表示 $sql = "select * from siritori order by db_no desc limit 10;"; $rst = mysql_query($sql,$con); //SQL配列読み込み(select文) while($col = mysql_fetch_array($rst)){ print $col["name"]."さん".$col["title"]."<br>".$col["kome"]."<hr>";} //$rst2 = $rst; 配列をコピーできないかなー?とかもやったのですができない。 なんとか巧い解決方法はないでしょうか? 連想配置や、MySQLには詳しくないのでお教えください。

    • ベストアンサー
    • MySQL
  • 2つのテーブルの連動

    MySQL3を使っています。 [tableA] ID |NUM ------- abc|1 def|2 ghi|3 [tableB] ID |TEXT ------- def|あいうえお abc|かきくけこ def|さしすせそ のような2つのテーブルがあって、[tableB]のデータを[tableA]のNUM列の番号順に、出力するにはどうすればいいのでしょうか? 上の例で行くと、 abc|かきくけこ def|あいうえお def|さしすせそ こんな感じの並びにしたいのです。

    • ベストアンサー
    • MySQL
  • WHERE文の中で、MYSQLにINSERTが出来ない。

    メールを指定した時間に送信しようとしています。 手順はMYSQLに送信したい時間とメールの色々を入れて、 CRONで現在時間を調べて、合致したものを送信する。 このような手順で実現しようとしていますが、 最初でつまずいています。 送信先メールアドレスを while で抽出しながら MYSQLへインサートするつもりですが 一度しかインサートしてくれません。 インサートのsqlを[print $sql;]で、表示したものをphpMyAdminで SQL を実行すると キチンと挿入できます。 **3回分まとめてSQL を実行してもうまく挿入できます。 前のページから送ったものは全て[print] で、思い通りの結果が表示します。 どなたか、ご教授お願いいたします。 $sql = "select count(*) as cnt from customer WHERE customerID IN (1,2,3,5,8)"; $rst = mysql_query($sql, $con); $col = mysql_fetch_array($rst); $tcnt = $col["cnt"]; mysql_free_result($rst); print $tcnt."通送信<br />"; $subject ="これはPOSTで送りました"; $honbun ="これはPOSTで送りました"; $from = '送信元メールアドレス'; $jikan = "これはPOSTで送りました"; $sql ="select * from customer WHERE customerID IN (1,2,3,5,8)"; $rst = mysql_query($sql, $con); while($col = mysql_fetch_array($rst)) { $customerID= $col['customerID']; $name = $col['name']; $mail = $col['mail']; i++ $sql = "INSERT INTO mail_queue_timer (timermailID,customerID, jikan ,sender , recipient ,headers, body ) VALUES ($timermailID, $customerID,$jikan , \"$from\" , \"$mail\" ,\"$subject\" , \"$honbun\" ) "; $rst = mysql_query($sql, $con); }

    • ベストアンサー
    • PHP
  • 2つのテーブルを結合する際にIDを割り当てたい

    PHPでmySQLを作成しています。 現在学習中なのですが、自己解決できない問題が発生したのでどうかお知恵をお貸しください。 --- 同じデータベースにTableAとTableBがあります。 中身は下記のようだとします。 TableA      |  TableB id  name time | name time :   :   :  |  C1   D2 101 A1  B1  |  C2   D2    102 A2  B2  |   :    : 103 A3  B3  |  C20  C20 --- テーブルAのカラムid、name、timeの3カラム、テーブルBはname、timeの2カラムです。 これを --- TableA        TableB id  name time  name time :   :   : 101 A1  B1 102 A2  B2 103 A3  B3 104 C1  D1 105 C2  D2 :   :   : 123 C20  D20 --- とするような方法を教えてください。(TableBはレコードなし) テーブルの結合ではIDが割り当てられず、上手な方法が思いつきません。 どうかご教示のほど、よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • SQLServer→Access インポート

    こんばんは。 Windows2000、Access2000でVBにて開発をしています。  1.SQLServerのリンクテーブルおよびAccessローカルテーブルからテーブル作成クエリを実行→TableA  2.TableAを「TableA_YYYY/MM/DD」としてSQLServerへコピー(YYYY/MM/DD=出力時の日付) 1.2.を前提に、前日のTableA_YYYY/MM/DDをAccessへ「TableB」としてインポートしたいのですが、 'SQLServerのデータベース名 Path = "ODBC;DSN=AAA;UID=BBB;PWD=CCC;DATABASE=DDD" DoCmd.TransferDatabase acImport, "ODBC データベース", Path, acTable, "TableA_" & DateAdd(d,-1,date), TableB, False, True とすると、 「クエリの構文エラーです。クエリの句が不完全です。」 とエラーになってしまいます。 どなたか、解決策を教えていただけたらと思います。

専門家に質問してみよう