欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-06-13 17:04:20
...
/**
 * @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 

测试

$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 当中

回复内容:

/**
 * @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 

测试

$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 当中

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

关键字:闭包

最优解当然是像 @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();

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

相关标签: php