とある変数 $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スクリプトを書いてください。
※他でもっと良い解決案も募集しております。
よろしくお願い致します。
dateをsplitして、前回のループのときの日付を保持しておき、その次の日からその回のループの前日までを、moneyが0でinsertしてやれば、できそうですね。
日付をキーにした連想配列に変換して、歯抜けの日付を埋めて、そのあと元の形式に戻すのはどうでしょう
<?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 ); ?>
ご回答ありがとうございます。
2014/08/10 12:33:47具体的なスクリプトを書いて頂けると助かります。
よろしくお願い致します。
ループ前に追加
2014/08/10 15:16:51$hi = -1;
$hi2 = -1;
ループ内に以下を追加
$ymd = split('/',$data[$i]["date"]);
$hi = intval($ymd[2]);
if ($hi2 != -1) {
for () {
($hi2 +1から$hi-1までを追加)
}
}
(元からあるinsert文)
$hi2 = $hi;
全部書かなくても分かりますよね。