检查数组的所有元素是否等于某事

时间:2013-10-04 14:19:19

标签: php

有无

$my_arr_1 = array ("denied","denied","denied");
$my_arr_2 = array ("denied","denied","allowed");

需要一个func来检查数组中的所有元素是否等于:

in_array_all("denied",$my_arr_1); // => true

in_array_all("denied",$my_arr_2); // => false

是否有像in_array_all这样的php本机函数?

如果没有,那么编写这样一个函数最优雅的方法是什么?

5 个答案:

答案 0 :(得分:3)

function in_array_all($needle,$haystack){
  if(empty($needle) || empty($haystack)){
    return false;
  }

  foreach($haystack as $k=>$v){
    if($v != $needle){
      return false;
    }
  }
  return true;
}

如果你想变得非常疯狂:

function in_array_all($needle,$haystack){
      if(empty($needle)){
        throw new InvalidArgumentException("$needle must be a non-empty string. ".gettype($needle)." given.");
      }
      if(empty($haystack) || !is_array($haystack)){
        throw new InvalidArgumentException("$haystack must be a non-empty array. ".gettype($haystack)." given.");
      }

      foreach($haystack as $k=>$v){
        if($v != $needle){
          return false;
        }
      }
      return true;
    }

答案 1 :(得分:2)

function in_array_all($value, $array)
{
  return (reset($array) == $value && count(array_unique($array)) == 1);
}

答案 2 :(得分:0)

我不知道你的代码的上下文。但是如何扭转逻辑呢?然后,您就可以使用PHP的本机函数in_array

$my_arr_1 = array ("denied","denied","denied");
$my_arr_2 = array ("denied","denied","allowed");

!in_array("allowed", $my_arr_1); // => true
!in_array("allowed", $my_arr_2); // => false

这完全取决于您的数据集。但鉴于样本数据,这将起作用。 (另外,请注意每个方法调用前面的否定!以产生所需的布尔结果。)

答案 3 :(得分:0)

使用array_count_values()的另一种解决方案:

function in_array_all(array $haystack, $needle) {
    $count_map = array_count_values($haystack);
    // in your case: [ 'denied' => 2, 'allowed' => 1 ]
    return isset($count_map[$needle]) && $count_map[$needle] == count($haystack);
}

答案 4 :(得分:0)

理查德的解决方案是最好的,但没有一个关闭的paren ;-) - 这里是固定和删节:

function in_array_all($needle,$haystack)
{
    if( empty($needle) || empty($haystack) ) return false;

    foreach($haystack as $v)
    {
        if($v != $needle) return false;
    }

    return true;
}