Php 查找数组值之间的步数的有效方法

Php 查找数组值之间的步数的有效方法,php,arrays,Php,Arrays,假设您有一个数组,表示根据PHP的日期('w')商店每周营业的天数,类似于: $open = array(1,3,4); // open on mon/wed/thu $week = array(0,1,2,3,4,5,6); // full week of days according to date('w') 你有当天的日期(例如6代表星期六)-计算下一个开放日前的天数/步骤的最有效方法是什么?这里有一个足够简单的方法…只需寻找下一个可用的日期: $daysUntilOpen=0; whi

假设您有一个数组,表示根据PHP的
日期('w')
商店每周营业的天数,类似于:

$open = array(1,3,4); // open on mon/wed/thu
$week = array(0,1,2,3,4,5,6); // full week of days according to date('w')

你有当天的日期(例如6代表星期六)-计算下一个开放日前的天数/步骤的最有效方法是什么?

这里有一个足够简单的方法…只需寻找下一个可用的日期:

$daysUntilOpen=0;
while (!in_array($day, $open))
{
   $day=($day+1)%7;
   $daysUntilOpen++;
}
如果你在做大量的查找,你可以构建一个数组来告诉你每天离开放时间有多少天,例如

$daysUntilOpenLookup=array();
foreach($week as $day)
{
    $daysUntilOpen=0;
    while (!in_array($day, $open))
    {
       $day=($day+1)%7;
       $daysUntilOpen++;
    }

    $daysUntilOpenLookup[$day]=$daysUntilOpen;
}
现在,您可以简单地这样做,以确定离开放时间还有多少天

$daysUntilOpen=$daysUntilOpenLookup[$day];

对于
$open
上最多七个值,您可以执行简单的线性搜索:

$nextWeekdayOpen = null;
$daysUntilNextOpen = null;
$currentWeekday = date('w');
foreach ($open as $weekday) {
    if ($weekday >= $currentWeekday) {
        $nextWeekdayOpen = $weekday;
        break;
    }
}
if (is_null($nextWeekdayOpen) && !empty($open)) {
    $nextWeekdayOpen = $open[0];
}
if (!is_null($nextWeekdayOpen)) {
    $daysUntilNextOpen = ($nextWeekdayOpen > $currentWeekday) ? $nextWeekdayOpen-$currentWeekday : 6-$currentWeekday+$nextWeekdayOpen;
}
这只是迭代开放的工作日,并查找第一个等于(即今天开放)或大于当前工作日的工作日。如果没有,则取第一个开放的工作日(假定已对开放的工作日进行排序)。最后计算下一个开放工作日和当前工作日之间的天数


此算法以线性时间复杂度运行。

我不确定效率是否真的是一个问题,因为项目数量很少:

for($i=1;$i<7;$i++) {
if (in_array((($day+$i)%7), $open)) break;
}

echo "Next open day in $i days";

for($i=1;$i这是我使用非常有用的strotime()函数来实现的方法。它的工作原理也非常清楚

<?php
// Get the current timestamp for comparison
$now = time();

// Get unix timestamps for each open day relative to comparison time $now
$monday = strtotime("next monday", $now);
$tuesday = strtotime("next wednesday", $now);
$thursday = strtotime("next thursday", $now);

// Put values in to array
$days_open = array($monday, $tuesday, $thursday);

// See which unix timestamp is least (the nearest to current day)
$nearest_day = min($days_open);

// Then you can get difference in days
$days_difference =  date('w', $nearest_day) - date('w', $now);

// You can show the difference like this
echo "We're next open in " , $days_difference , " days";
?>

对于最高效,你是指最佳性能(最快)还是其他什么。这真的是一个问题吗?有任何答案有用吗?很好的实现。Wiki文章。你在for循环中调用in_数组,所以你有O(n^2)复杂性。我提到这一点是因为OP关注效率。