检查所有数组值是否在范围内的最佳方法

时间:2016-03-03 18:57:27

标签: php arrays

检查所有数组值是否在范围内的最佳方法是什么?

例如:

$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()

6 个答案:

答案 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
    ?>

检查此问题的最简单方法是在此处使用maxmin,因为您可以避免在此验证整数。 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.
}

旁注;在编程方面,范围可能意味着一些事情:

  • 检查数字是否在两个数字之间。
  • 范围,使用可选的步骤开始循环到结束
  • PHP函数range(),使用可选的步骤
  • 将数组从 start 返回到 end

这是一个非常令人困惑的问题。

答案 3 :(得分:0)

这是一种有趣的方式:

var_dump(
    array_values($array1) == array_filter(array_values(array_intersect($range, $array1)), 'is_int')
);
  • 计算范围和数组之间的交集
  • 删除非整数
  • 与数组比较
  • 结果为truefalse

答案 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