在数组中搜索某个范围内的数字的最佳方法是什么?例如,在1000到1500之间。
<?php
$numbers = array(1105,2140,3170);
$needle = **value between 1000 and 1500**;
if (in_array($needle, $numbers)) {
echo "Match found";
} else {
echo "Match not found";
}
?>
在这种情况下,这将返回"找到匹配项",因为 1105 介于 1000 和 1500 之间。
我可以为$needle
变量设置范围吗?
在数组中搜索范围内数字的最佳方法是什么。要回答这个问题,有两种方法,如下所述:
方法#1:
您可以使用简单的 foreach 循环从范围内的无序数据中获取所有值。
<?php
$numbers = array(1105,2140,3170);
$start = 1000;
$end = 1500;
$result = [];
foreach($numbers as $num){
if($num >= $start && $num <= $end) $result[] = $num;
}
print_r($result);
演示:https://3v4l.org/D1Rfu
方法 #2:(建议用于将来查找(
您可以对数据进行排序并使用binary search
来获取数字开始下降的起点,start
和end
范围内,以便更快地查找。然后,您可以从该索引开始查看,直到索引获得更高的数字或到达数组的末尾。
<?php
$numbers = array(1105,2140,3170,1000,1500,1501);
$start = 1000;
$end = 1500;
$start_index = -1;
sort($numbers);
$low = 0; $high = count($numbers) - 1;
while($low <= $high){
$mid = intval(($low + $high) / 2);
if($numbers[$mid] > $end){
$high = $mid - 1;
}else if($numbers[$mid] < $start){
$low = $mid + 1;
}else{
$start_index = $mid;
$high = $mid - 1;
}
}
$result = [];
for($i = $start_index; $i < count($numbers); ++$i){
if($numbers[$i] > $end) break;
$result[] = $numbers[$i];
}
print_r($result);
演示:https://3v4l.org/WcgXv
是的,您可以创建一个范围并将其用作"针",但不能使用in_array
. 您可以创建一个范围并计算数字数组的交集。要仅检查任何匹配项,请执行以下操作:
$numbers = array(1105, 2140, 3170);
$needle = range(1000, 1500);
if (array_intersect($numbers, $needle)) {
echo "Match found";
} else {
echo "Match not found";
}
或者要获得可能的匹配项,请执行以下操作:
$numbers = array(1105, 2140, 3170);
$needle = range(1000, 1500);
$result = array_intersect($numbers, $needle);
或者您可以过滤掉不在范围内的那些:
$numbers = array(1105, 2140, 3170);
$min = 1000;
$max = 1500;
$result = array_filter($numbers, function($v) use($min, $max) {
return $v >= $min && $v <= $max;
});
如果两种情况下都没有匹配项,您将获得一个空数组。 此外,如果有多个数组,您不会说明您想要什么,但无论哪种情况,您都会得到一个数组,因此您可以将current
用于一个或min
和/或max
:
$one = current(array_intersect($numbers, $needle));
$min = min(array_intersect($numbers, $needle));
$max = max(array_intersect($numbers, $needle));
没有用于这些目的的内置函数。因此,创建一个对您有所帮助的函数。
function searchOnRange(array $stack, $min=0, $max=0)
{
// Loop through each value of array
foreach($stack as $value){
// CHeck value is between the given range
if(($value >= $min) && ($value <= $max)){
echo "Match found - ".$value;
} else {
echo "Match not found - ".$value;
}
}
}
$numbers = array(1105,2140,3170);
searchOnRange($numbers, 1000, 1500);