检查所有数组值是否在范围内的最佳方法是什么?
例如:
$range = range(10, 40);
$array1 = array(10, 20, 40); // OK
$array2 = array(11, 22, 42, 30); // FALSE
$array3 = array(50); // OK
$array4 = array(10, 20, 30, 'a'); // FALSE
$array5 = array("%", 20); // FALSE
$array6 = array(10, 20, 40, 39, 40); // OK
那么如何检查数组值是否为数字(整数)且是否在范围内?
我试过了:
$tmp = 0;
foreach ($array1 as $a1) {
if (!in_array($a1, $range) && is_int($a1)) {
$tmp++;
}
}
if ($tmp > 0) {
echo "false";
} else {
echo "ok";
}
也许是更好的方式?也许与array_map()
?
答案 0 :(得分:4)
<?php
$range = range(10, 40);
$array1 = array(10, 20, 40);
$isInRange = (min($array1)>=min($range) and max($array1)<=max($range)) ? "Yes" : "No";
echo $isInRange;
//prints 'Yes' when compared with array(10, 20, 40);
//prints 'No' when compared with array(11, 22, 42, 30); as you have out range value 42 here
?>
检查此问题的最简单方法是在此处使用max
和min
,因为您可以避免在此验证整数。 max
选择数组中的最大值,min
选择最小值。
答案 1 :(得分:0)
这样的事情会起作用吗?
它将数组中的每个值与范围($ min和$ max)进行比较,如果数组中的某个值不在指定范围之间,则返回“Not in range”。
$min = 10;
$max = 40;
$array1 = array(10, 20, 40); // OK
foreach ($array1 as $tmpArr){
if (!($min<=$tmpArr && $tmpArr<=$max)){
echo "Not in range";
break;
}
}
答案 2 :(得分:0)
function array_values_all_numbers($a, $min = PHP_INT_MIN, $max = PHP_INT_MAX){
foreach($a as $v){
if(is_int($v) && $v >= $min && $v <= $max){
return false;
}
}
return true;
}
var_dump(array_values_all_numbers(range(0, 100, 3))); // true
var_dump(array_values_all_numbers([1, 2, 3, 4, 'a'])); // false
var_dump(array_values_all_numbers([1, 2, 3, 4], 3, 4)); // false
var_dump(array_values_all_numbers([1, 2, 3, 4], 2, 4)); // true
或者可能是另一种选择:
$myarray = array_filter(array_values($input), 'is_int');
foreach($myarray as $value){
// loop over all array values that are numbers and skip the rest.
}
旁注;在编程方面,范围可能意味着一些事情:
range()
,使用可选的步骤 这是一个非常令人困惑的问题。
答案 3 :(得分:0)
这是一种有趣的方式:
var_dump(
array_values($array1) == array_filter(array_values(array_intersect($range, $array1)), 'is_int')
);
true
或false
答案 4 :(得分:0)
运行它并在这里学习。
<?php
$array1 = array(11, 20, 30);
$array2 = array(11, 22, 22, 30);
$array3 = array(20);
$array4 = array("a", 20, 30, 13);
$array5 = array(46, 20);
$array6 = array(52, 20, 31, 39, 30);
$arr = array($array1, $array2, $array3, $array4, $array5, $array6);
array_walk($arr, function($val){
if( min($val) > 10 && max($val) < 40){
echo "<br/>matched for<br/>";
print_r($val);
} else {
echo "<br/>not matched for<br />";
print_r($val);
}
});
?>
有很多更好的方法,你可以试试。
输出
matched for
Array ( [0] => 11 [1] => 20 [2] => 30 )
matched for
Array ( [0] => 11 [1] => 22 [2] => 22 [3] => 30 )
matched for
Array ( [0] => 20 )
not matched for
Array ( [0] => a [1] => 20 [2] => 30 [3] => 13 )
not matched for
Array ( [0] => 46 [1] => 20 )
not matched for
Array ( [0] => 52 [1] => 20 [2] => 31 [3] => 39 [4] => 30 )
答案 5 :(得分:0)
我假设你只有一个普通数组而不是一个关联数组。
<?php
$a = array(1,2,3);
$b = array(2,3);
$c = array(2,3,4);
function all_in_range(array $needle, array $haystack) {
return array_reduce(
$needle,
function($carry, $item) use ($haystack){
return $carry?in_array($item,$haystack):false;
},
true
);
}
var_dump(all_in_range($b, $a)); // check $b inside $a - true
var_dump(all_in_range($c, $a)); // check $c inside $a - false
结果:
bool(true)
bool(false)
===或类似的东西===
function all_in_range(array $needle, $min, $max) {
return ( is_int($min) && is_int($max) ) ?
array_reduce(
$needle,
function($carry, $item) use ($min, $max){
// limits values are included
return $carry?is_int($item)?($item>=$min && $item<=$max):false:false;
},
true
) : 'wrong limits';
}
var_dump(all_in_range($b, 1, 3)); // check $b inside range 1..3
var_dump(all_in_range($c, 1, 3)); // check $c inside range 1..3