2

私はこのような配列を持っています:

$data = array(
    array('timestamp' => 1312776000, 'something' => 100), // data for 08.08.2011
    array('timestamp' => 1312862400, 'something' => 120), // data for 09.08.2011
    //  ????????                                          // data for 10.08.2011
    array('timestamp' => 1313035200, 'something' => 160), // data for 11.08.2011
    array('timestamp' => 1313121600, 'something' => 180), // data for 12.08.2011
    array('timestamp' => 1313208000, 'something' => 200), // data for 13.08.2011
    //  ????????                                          // data for 14.08.2011
    //  ????????                                          // data for 15.08.2011
    //  ????????                                          // data for 16.08.2011
    //  ????????                                          // data for 17.08.2011
    array('timestamp' => 1313640000, 'something' => 300), // data for 18.08.2011
);

「穴」を特定し、「何か」=> 0のサブ配列で埋める方法は?ご覧のとおり、「穴」は非常に大きくなる可能性があるため、この問題を自分で解決できませんでした。私のアルゴリズムでは、小さな「穴」しか埋めることができません(2011年8月10日など、2011年8月14日->17.08はできません。 2011)。

4

3 に答える 3

0

データは並べ替えられているように見えますが、1日に1つの値が必要だと思います。新しい出力配列を作成するという怠惰なアプローチを採用しましたが、既存の配列に値を追加し、最後にタイムスタンプで並べ替えることができます。

私はこのようなことをします:

$outArray = array();
$lastTime = $data[0]['timestamp'] - 86400;
foreach($data as $values) {
    $dayDelta = ($values['timestamp'] - $lastTime)/86400;
    if ( $dayDelta != 1) {
        for ($i = $dayDelta-1; $i--; $i>0) {
            $pastDate = $values['timestamp'] - $i * 86400;
            $outArray[] = array('timestamp'=>$pastDate, 'something'=>0);
        }
    }
    $outArray[]=$values;
    $lastTime = $values['timestamp'];
}
于 2012-07-02T22:23:42.100 に答える
0

考慮すべき別のアプローチ:

$previous_d = false;
for($di=0; isset($data[$di]); $di++) {
    $d = $data[$di];
    if($previous_d && ($d['timestamp']-$previous_d['timestamp'])>86400) {
        $new_d = array('timestamp'=>$previous_d['timestamp']+86400,'something'=>0);
        array_splice($data,$di,0,array($new_d));
        $di--;
    }
    $previous_d = $d;
}
于 2012-07-02T22:37:50.910 に答える
0

これは次のように行うことができます。

$new = array();
$prev = reset($data);
while ($record = reset($data)) {
    while ($prev['timestamp'] < $record['timestamp']-86400) {
        $prev['timestamp'] += 86400;
        $prev['something'] = 0;
        $new[] = $prev;
    }
    $new[] = $record;
    $prev = $record;
    unset($data[key($data)]);
}
$data = $new;

echo '<pre>';
var_export($data);
echo '</pre>';
于 2012-07-02T22:40:22.627 に答える