2016-03-03 3 views
1

Как лучше всего проверить, находятся ли все значения массива в диапазоне?Лучший способ проверить, находятся ли все значения массива в диапазоне

Например:

$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

так, что вы пробовали ?? –

+0

Функция 'min' даст вам минимальное значение всех массивов, которые вы выбрасываете на него. Функция 'max' даст вам максимальное значение всех массивов, которые вы выбрали на нем. Вы можете увидеть, если 'min ($ a1, $ a2, $ a3) <10', чтобы проверить нижнюю границу и сделать что-то подобное для верхней границы. – kainaw

+0

1 и 2 не находятся между 10 и 40 и ни 5, и т.д ... поэтому ваши примеры не соответствуют описанию. – AbraCadaver

ответ

0

Будет ли что-то подобное выполнять эту работу?

Он сравнивает каждое значение в массиве с диапазоном ($ min и $ max) и возвращает «Не в диапазоне», если одно из значений в массиве не находится между указанным диапазоном.

$min = 10; 
$max = 40; 


$array1 = array(10, 20, 40); // OK 


foreach ($array1 as $tmpArr){ 
    if (!($min<=$tmpArr && $tmpArr<=$max)){ 
     echo "Not in range"; 
     break; 
    } 
} 
3
<?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 - наименее одно.

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(), возвращая массив из начал до конца с дополнительным шагом

Это делает для очень запутанного вопроса.

0

Вот интересный способ:

var_dump(
    array_values($array1) == array_filter(array_values(array_intersect($range, $array1)), 'is_int') 
); 
  • Вычислить пересечение диапазона и массива
  • Удалить нецелые
  • Сравнение с массивом
  • Результат true или false
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) 
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