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>
違う書き方でも結果が同じであれば、それでも構いません。
少しでもアドバイスをいただければ助かります。よろしくお願い致します。
A 回答 (6件)
- 最新から表示
- 回答順に表示
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
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は使えないのでこうするしかないです。
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>
この回答への補足
何度も有難うございます!
質問用に簡略化したソースを提示しましたが、他の部分もかなり量があるので、PDOの使い方を調べながら書く時間が無いのです。すみません。
今まであまりforeachは使ってなかったので思いつきませんでした。これから回答を参考に書き直してみます。有難うございました。
No.3
- 回答日時:
・explode
http://php.net/manual/ja/function.explode.php
・list
http://php.net/manual/ja/function.list.php
この回答への補足
if($shop){
list($s_name,$s_add,$s_tell) = explode(':', $shop);
}
今まで↑のような感じで使っていましたが、今回はフィールド数が膨大でcell01~cell200まで200個あります。
中に入るデータ形式は同じなので、纏めて分割する方法が知りたいのです。
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
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>
有難うございます。
PDOを使うべきなのは存じてますが、今回はとにかく早く作るようにせっつかれていますので取り敢えずmysql関数でいく予定です。
いずれはPDOで書き直さなければならないので、その際に参考にさせていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel 、この式はどのように解釈すればいいのでしょうか 4 2023/02/03 08:53
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
- その他(プログラミング・Web制作) seleniumbasic chrome操作について 1 2023/03/29 15:40
- JavaScript gasについて 1 2022/05/31 21:51
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- JavaScript java keyを配列で表記したい 10 2022/12/01 17:53
- Excel(エクセル) Excelでこの式の意味をおしえていただけますでしょうか、またどのように理解したらいいのでしょうか 3 2022/11/18 00:11
- その他(コンピューター・テクノロジー) Pythonの np.indicesに関する質問です。 2 2023/02/07 08:19
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHP 関数呼び出し後に配列添字...
-
phpでmysqlを使ってデータベー...
-
空だと思ったのに・・・
-
会員ページ SESSIONについて
-
PHPで[]の使い方について
-
アラートでyes noを作りたいです。
-
mysqlから取得した配列をカンマ...
-
同じページを再利用させたい
-
チェックボックスの値の受け渡し
-
insert1つの処理でもトランザ...
-
実行時エラー3131 FROM 句の構...
-
MySQLでデータベースにデータin...
-
Pro*Cの構文エラー
-
【ASP.NET】MySQLのテーブルレ...
-
テキストボックスに入れた内容...
-
php MySQL で、更新ボタンを押...
-
Accessのテーブルへ複数の主キ...
-
SELECT文を発行して、ACCESSよ...
-
mysql_fetch_array の関数について
-
stringaddslashes 半角¥が消える
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アラートでyes noを作りたいです。
-
dbに登録したデータをphpのプル...
-
PHPで[]の使い方について
-
checkboxクリック時、SQLを実行...
-
php ログインフォーム作成
-
php5のコンストラクタをphp4仕...
-
PHPでMySQLデータを呼び出し、w...
-
phpでmysqlを使ってデータベー...
-
SELECT結果から動的にコンボボ...
-
checkboxで複数選択して,OR...
-
mysqlから取得した配列をカンマ...
-
DBで検索結果に該当するデータ...
-
ラジオボタンをループすること...
-
エクセルVBAについて
-
sortable ギブアップです…助け...
-
[php]mysqlデータ配列取得について
-
チェックボックスによる複数の...
-
PHPとSmartyを使い、データベー...
-
DBに入力されている値で、セ...
-
PHP、SQLite3のデーターでログ...
おすすめ情報