人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP

とある変数 $data には下記のようなデータが入っています。

$data = array();
$data[] = array("date"=>"2013/01/01", "money"=>1200);
$data[] = array("date"=>"2013/01/02", "money"=>2300);
$data[] = array("date"=>"2013/01/23", "money"=>300);

上記データには日付と支払金額(money)の2つが連想配列として入っています。

これらデータを元に日別のデータをMySQL上に登録したいのですが、
日付が続いていない為、上記データの場合1月3日?22日までのデータが登録されません。

↓MySQL登録スクリプト

for($i=0;count($data)>$i;$i++)
{
mysql_query("insert into hoge (`date`,`money`) values (" . $data[$i]["date"] ."," . $data[$i]["money"] . ")");
}

渡される値 $data の中で抜けている日を適切に抽出し、
array("抜けている日",0); を追加する簡単なPHPスクリプトを書いてください。

※他でもっと良い解決案も募集しております。

よろしくお願い致します。

●質問者: webtomake
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● pogpi
●50ポイント

dateをsplitして、前回のループのときの日付を保持しておき、その次の日からその回のループの前日までを、moneyが0でinsertしてやれば、できそうですね。


webtomakeさんのコメント
ご回答ありがとうございます。 具体的なスクリプトを書いて頂けると助かります。 よろしくお願い致します。

pogpiさんのコメント
ループ前に追加 $hi = -1; $hi2 = -1; ループ内に以下を追加 $ymd = split('/',$data[$i]["date"]); $hi = intval($ymd[2]); if ($hi2 != -1) { for () { ($hi2 +1から$hi-1までを追加) } } (元からあるinsert文) $hi2 = $hi; 全部書かなくても分かりますよね。

2 ● いわわ
●50ポイント

日付をキーにした連想配列に変換して、歯抜けの日付を埋めて、そのあと元の形式に戻すのはどうでしょう

<?php
// もとデータ
$data = array();
$data[] = array("date"=>"2013/01/01", "money"=>1200);
$data[] = array("date"=>"2013/01/02", "money"=>2300);
$data[] = array("date"=>"2013/01/23", "money"=>300);

// キーを日付とする連想配列に変換
foreach($data as $d) $list[$d["date"]] = $d;

// 日付の最初と最後を抽出
$start = strtotime(min(array_keys($list)));
$end = strtotime(max(array_keys($list)));

// ループして歯抜けの日付を補完
for( $t=$start; $t<$end; $t+=86400 ){
 $stamp = strftime("%Y/%m/%d",$t);
 if( ! isset($list[$stamp]) ){
 $list[$stamp] = array("date"=>$stamp, "money"=>0);
 }
}
ksort($list);

// もとの形に戻す
$data = array();
foreach($list as $l) $data[] = $l;

print_r( $data );
?>
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ