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スクリプトを書いてください。

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

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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/08/16 15:20:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:pogpi No.1

回答回数428ベストアンサー獲得回数59

ポイント50pt

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

id:webtomake

ご回答ありがとうございます。

具体的なスクリプトを書いて頂けると助かります。

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

2014/08/10 12:33:47
id: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;
全部書かなくても分かりますよね。

2014/08/10 15:16:51
id:iww No.2

回答回数101ベストアンサー獲得回数10

ポイント50pt

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

<?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 );
?>

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません