【问题标题】:Should I store the result of an function into an array?我应该将函数的结果存储到数组中吗?
【发布时间】:2016-12-14 19:23:09
【问题描述】:

我有这样的功能:

function time_elapsed_string($ptime)
{
            $date_time = strtotime("1348-10-10 04:30:01") + $ptime;
            $year = date("Y",$date_time);
            $month = date("m",$date_time);
            $day = date("d",$date_time);
            $time = date("H:i:s",$date_time);

    $etime = time() - $ptime + 1;

    $a = array( 31536000  =>  'year',
                 2592000  =>  'month',
                   86400  =>  'day',
                    3600  =>  'hour',
                      60  =>  'minute',
                       1  =>  'second'
                );

    foreach ($a as $secs => $str)
    {
        $d = $etime / $secs;
        if ($d >= 1)
        {
            $r = round($d);
                                                                   // EX:
            return array('date' => $day.'-'.$month.'-'.$year,      // 2016-02-20
                         'time' => $time,                          // 03:30:04
                         'difference' => $r . ' ' . $str . ' ago'  // 2 month ago
                        );
        }
    }
}

我是这样使用它的:

$ptime = 1470692661;
$html = '<span title="date: '.time_elapsed_string($ptime)['date'].' time: '.time_elapsed_string($ptime)['time'].'">in '.time_elapsed_string($ptime)['difference'].'<span>';

如您所见,我正在使用该函数的结果,如下所示:

time_elapsed_string($ptime)['date']
ime_elapsed_string($ptime)['time']
time_elapsed_string($ptime)['difference']

事实上,每次我需要它的结果之一时,我都会调用该函数。那正确吗?还是应该调用一次并将其存储到数组中?

注意:我的代码也可以。

【问题讨论】:

标签: php performance function


【解决方案1】:

从像这样的某个日期/时间开始计算经过的时间是 mauvais ton

DateTime 自 PHP 5.2.0 起就可用,但很多人都低估了它。为什么不用这个来代替loops 和ifs?

$create_time = "2016-08-02 12:35:04";
$current_time="2016-08-02 16:16:02";

$dtCurrent = DateTime::createFromFormat('Y-m-d H:i:s', $current_time);
// to use current timestamp, use the following:
//$dtCurrent = new DateTime();
$dtCreate = DateTime::createFromFormat('Y-m-d H:i:s', $create_time);
$diff = $dtCurrent->diff($dtCreate);

现在,您可以format 任意结果:

$interval = $diff->format("%h hours %i minutes %s seconds");

这将提供一个干净的3 hours 40 minutes 58 seconds,没有任何数组,这样更好。

更新

有一个通过正则表达式获取小时/分钟/秒的通用解决方案:

$interval = $diff->format("%y years %m months %d days %h hours %i minutes %s seconds");

// now remove zero values
$interval = preg_replace('/(^0| 0) (years|months|days|hours|minutes|seconds)/', '', $interval);

更新 2

根据您的评论:

看,我想用你的方法..但我真的无法实现它..实际上我需要三件事:timedatedifference ..!但是你的方法并没有给我它们..

嗯,我们已经知道如何获得差异,就是上面描述的$interval 变量。

要获取时间和日期,您可以再次使用格式从$dtCreate 变量中获取它:

$time = $dtCreate->format('H:i:s');
$date = $dtCreate->format('d-m-Y');

【讨论】:

  • strtotime\date 应该在手册中有很大的注释,不要实际使用它们
  • @Dagon 他们这样做了,但最终丢失数组数据比丢失一些对象数据更容易,除非您显式调用设置器或直接设置它们。 IMO,对象应该在数组上使用,因为你总是可以限制对对象属性的访问。
  • 来吧 - 正则表达式 - 真的吗?没必要!
  • @RobbieAverill 从现在开始的可能性是无穷无尽的,但我的意思不是使用正则表达式;它在使用DateTime
  • 看,我想用你的方法..但我真的无法实现它..实际上我需要三件事:timedatedifference ..!但是your approach 没有给我它们..
【解决方案2】:

这很简单。

- 将time_elapsed_string($ptime) 的函数调用结果存储在一个数组中,然后使用它来访问您的结果。否则你就是在浪费 CPU 周期!

// call it once
$result = time_elapsed_string($ptime);

// then use:
$result['date'];
$result['time'];
$result['difference'];

【讨论】:

  • 谢谢 .. upvote .. 顺便说一句,"This is a no brainer" 是什么意思? (老实说我英语不好)
  • 我想知道 cpu 周期是浪费了多次访问函数,而不是在多次访问数组时浪费
  • @MartinAJ no brainer 的意思是:需要或涉及很少或不需要脑力劳动的东西。
猜你喜欢
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多