首页 > PHP 的这个函数array_map如何优化(如何传入参数)

PHP 的这个函数array_map如何优化(如何传入参数)

/**
 * @param string $hisStart
 * @param string $hisEnd
 * @param int    $range
 * @param string $format
 *
 * @return array
 */
function createHisRange($hisStart = '00:00:00', $hisEnd = '23:59:59', $range = 3600, $format = 'H:00:00')
{
    $t1 = strtotime($hisStart);
    $t2 = strtotime($hisEnd);
    $arrHis = array();
    while($t1 < $t2){
        $arrHis[] = date($format,$t1);
        $t1 += $range;
    }

    return $arrHis;

//    return array_map(function ($time) {
//        return date($format, $time);
//    }, range(strtotime($hisStart), strtotime($hisEnd), $range));
}

测试

$s = createHisRange();
print_r($s);
/*
Array
(
    [0] => 00:00:00
    [1] => 01:00:00
    [2] => 02:00:00
    [3] => 03:00:00
    [4] => 04:00:00
    [5] => 05:00:00
    [6] => 06:00:00
    [7] => 07:00:00
    [8] => 08:00:00
    [9] => 09:00:00
    [10] => 10:00:00
    [11] => 11:00:00
    [12] => 12:00:00
    [13] => 13:00:00
    [14] => 14:00:00
    [15] => 15:00:00
    [16] => 16:00:00
    [17] => 17:00:00
    [18] => 18:00:00
    [19] => 19:00:00
    [20] => 20:00:00
    [21] => 21:00:00
    [22] => 22:00:00
    [23] => 23:00:00
)

*/

问题

如何将 $format 传入到 array_map 当中

最优解当然是像 @picasso250 一样用use了

 return array_map(function ($t) use ($f) {
    return date($f, $t);
}, range(strtotime($s), strtotime($e), $r));

如果用不了use关键字的话低版本的话还可以用global:

$format = "H:i:s";
function fm($t){
    global $format;
    return date($format, $time);
}
array_map('fm', range(strtotime($hisStart), strtotime($hisEnd), $range));

当然用Class写这个也是可以的,就是看起来特别麻烦...

Class hisRange {
    public $s, $e, $r, $f;

    function __constructor($s= '00:00:00', $e= '23:59:59', $r= 3600, $f= 'H:00:00') {
        $this->s = strtotime($s);
        $this->e = strtotime($e);
        $this->r = $r;
        $this->f = $f;
    }

    function run() {
         return array_map(array($this, 'fm'), range($this->s, $this->e, $this->r));
    }

    function fm($t) {
        return date($this->f, $t);
    }
}

$range = new hisRange();
$s = $range->run();

好吧,我大概只是来提供不同的解法的...


    return array_map(function ($time) use ($format) {
        return date($format, $time);
    }, range(strtotime($hisStart), strtotime($hisEnd), $range));

关键字:闭包

【热门文章】
【热门文章】