0

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

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

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

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

有没有像 in_array_all 这样的 php 原生函数?

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

4

5 回答 5

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;
    }
于 2013-10-04T14:22:38.690 回答
3
function in_array_all($value, $array)
{
  return (reset($array) == $value && count(array_unique($array)) == 1);
}
于 2013-10-04T14:23:42.683 回答
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);
}
于 2013-10-04T14:29:36.647 回答
0

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

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

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

    return true;
}
于 2013-10-04T14:40:16.933 回答
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

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

于 2013-10-04T14:28:07.750 回答