使用原生PHP基于不連續(xù)數(shù)組生成連續(xù)數(shù)組函數(shù)參考

PHP自帶了非常強大的時間處理功能。

假如有一個用戶每日步數(shù)統(tǒng)計數(shù)據的數(shù)組:

<?php

$userStepReports = [
    [
        'date' => '2017-02-06',
        'total' => 652,
    ],
    [
        'date' => '2017-03-01',
        'total' => 773,
    ],
    [
        'date' => '2017-03-02',
        'total' => 459,
    ],
];

如果需要生成一個用戶從2月1號到3月29號的步數(shù)統(tǒng)計折線圖,因為一些圖表控件的限制,我們必須傳遞一個有57天數(shù)據的大數(shù)組,否則會生成一個只有3列數(shù)據的圖表。這種情況下,我們就得基于已有的數(shù)組去補足出一個大數(shù)組,沒有的就添加一個total等于0的數(shù)據。

很多同學會立馬想起Carbon這個庫,但這里我們用原生方法實現(xiàn),實際也并不復雜,代碼參考如下:

<?php

function getDataInTimeSpan($input, $startDate, $endDate, $dateProperty, $default)
{
    $start = new \DateTime($startDate);
    $end   = new \DateTime($endDate);

    if ($start->diff($end)->invert === 1) {
        throw new \LogicException('開始時間不能大于結束時間');
    }

    $keyedInput = [];
    foreach ($input as $value) {
        $keyedInput[$value[$dateProperty]] = $value;
    }

    $endAt   = (clone $end)->modify('+1 day')->format('Y-m-d');
    $current = clone $start;
    $output  = [];

    while (($currentDate = $current->format('Y-m-d')) !== $endAt) {
        // 這里用了PHP 7的新操作符
        $output[] = $keyedInput[$currentDate] ?? array_merge($default, [
                $dateProperty => $currentDate,
            ]);

        $current->modify('+1 day');
    }

    return $output;
}

$userStepReports = [
    [
        'date' => '2017-02-06',
        'total' => 652,
    ],
    [
        'date' => '2017-03-01',
        'total' => 773,
    ],
    [
        'date' => '2017-03-02',
        'total' => 459,
    ],
];

$reports = getDataInTimeSpan(
    $userStepReports,
    '2017-02-01',
    '2017-03-29',
    'date',
    ['total' => 0]
);

延伸閱讀

PHP: Date/Time

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,351評論 25 708
  • Composer Repositories Composer源 Firegento - Magento模塊Comp...
    零一間閱讀 4,021評論 1 66
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,695評論 4 61
  • 居然沒在預定的時間申購,感覺要錯過了,但是…… 居然有配號,不過,還是……
    Hahamin哈哈明閱讀 193評論 0 0
  • 今天是五月工作的第一天,五月在我的印象裡是年輕蓬勃的,五四青年節(jié)也馬上到來。今天又恰巧是我們第19期《傑出青...
    精尚閱讀 226評論 0 0

友情鏈接更多精彩內容