我已经被困在这个PHP问题上大约一天了。基本上,我们有一个以24小时格式格式化的小时数组,以及任意值($hour
)(也是24小时)。问题是,我们需要取$hour
,并获取数组中的下一个可用值,从立即进行$hour
的值开始。
数组可能类似于:
$goodHours = array('8,9,10,11,12,19,20,21).
然后小时值可能是:
$hour = 14;
所以,我们需要一些方法来知道19是下一个最好的时间。此外,我们可能还需要获得第二个,第三个或第四个(等)可用值。
问题似乎是因为14不是数组中的值,所以没有引用的索引可以让我们递增到下一个值。
为了简单起见,我已经使用了$goodHours
并重复了几次这样的值,所以我没有必要回到开始(可能不是最好的方法,但是快速修复)。
我觉得这很简单,我很遗憾,但如果有人能说清楚,我会非常感激。
埃里克
答案 0 :(得分:4)
您可以使用for循环迭代数组,直到找到第一个大于您正在搜索的数组:
$goodHours = array(8,9,10,11,12,19,20,21);
$hour = 14;
$length = count($goodHours);
for ($i = 0 ; $i < $length ; $i++) {
if ($goodHours[$i] >= $hour) {
echo "$i => {$goodHours[$i]}";
break;
}
}
会给你:
5 => 19
而且,要获得您正在搜索的项目,以及之后的项目,您可以使用以下内容:
$goodHours = array(8,9,10,11,12,19,20,21);
$hour = 14;
$numToFind = 2;
$firstIndex = -1;
$length = count($goodHours);
for ($i = 0 ; $i < $length ; $i++) {
if ($goodHours[$i] >= $hour) {
$firstIndex = $i;
break;
}
}
if ($firstIndex >= 0) {
$nbDisplayed = 0;
for ($i=$firstIndex ; $i<$length && $nbDisplayed<$numToFind ; $i++, $nbDisplayed++) {
echo "$i => {$goodHours[$i]}<br />";
}
}
这会给你以下输出:
5 => 19
6 => 20
基本上,这里的想法是:
>=
的第一个项目为您要查找的内容
答案 1 :(得分:3)
您也可以使用SPL FilterIterator。虽然它不是最快的解决方案,但它的优点是你可以在任何地方/任何地方“准备”迭代器,然后将它传递给一个函数/方法,它不必知道迭代器如何在内部工作,即你可以在下次传递一个完全不同的迭代器。
class GreaterThanFilterIterator extends FilterIterator {
protected $threshold;
public function __construct($threshold, Iterator $it) {
$this->threshold = $threshold;
parent::__construct($it);
}
public function accept() {
return $this->threshold < parent::current();
}
}
function doSomething($it) {
// no knowledge of the FilterIterator here
foreach($it as $v) {
echo $v, "\n";
}
}
$goodHours = array(8,9,10,11,12,19,20,21);
$it = new GreaterThanFilterIterator(14, new ArrayIterator($goodHours));
doSomething($it);
打印
19
20
21
答案 2 :(得分:1)
由于$goodHours
已经排序,这很简单:
$next = 0;
foreach($goodHours as $test)
if($test > $hour && $next = $test)
break;
在四行之后(可以用较少的行自然写入),$next
如果在$hour
中无法匹配$goodHours
或者包含立即进行的值$hour
。这就是你要求的。
仅当$goodHours
已排序时才有效,如果不排序,您可以使用asort()函数对其进行排序。
答案 3 :(得分:0)
尝试此功能:
function nextValueGreaterThan($haystack, $needle, $n=1) {
sort($haystack);
foreach ($haystack as $val) {
if ($val >= $needle) {
$n--;
if ($n <= 0) {
return $val;
}
}
}
}
$goodHours = array(8,9,10,11,12,19,20,21);
echo nextValueGreaterThan($goodHours, 14); // 19
echo nextValueGreaterThan($goodHours, 14, 3); // 21
答案 4 :(得分:0)
这是一个类似于其余部分的答案,包括一个可选的“偏移”参数,它使你的第n个项目超过事实上的第一个。
class GoodHours {
private $hours = array(8,9,10,11,12,19,20,21);
public function getGoodHour($hour, $offset = 0) {
$length = count($this->hours);
for ($i = 0 ; $i < $length && $this->hours[$i] < $hour ; $i++)
; // do nothing
return $this->hours[($i + $offset) % $length];
}
}
// some test values
$good = new GoodHours();
$x = $good->getGoodHour(5); // 8
$x = $good->getGoodHour(5,1); // 9
$x = $good->getGoodHour(5,2); // 10
$x = $good->getGoodHour(10); // 10
$x = $good->getGoodHour(10,1); // 11
$x = $good->getGoodHour(10,2); // 12
$x = $good->getGoodHour(21); // 21
$x = $good->getGoodHour(21,1); // 8
$x = $good->getGoodHour(21,2); // 9
$x = $good->getGoodHour(21); // 8
$x = $good->getGoodHour(22,1); // 9
$x = $good->getGoodHour(22,2); // 10