60

配列内のすべての値が同じかどうかを確認する必要があります。

例えば:

$allValues = array(
    'true',
    'true',
    'true',
);

配列内のすべての値が等しい場合'true'、 echo が必要です'all true'。配列内のいずれかの値が等しい場合'false'、エコーしたい'some false'

これを行う方法について何か考えはありますか?

4

8 に答える 8

130

すべての値がテスト値と等しい:

// note, "count(array_flip($allvalues))" is a tricky but very fast way to count the unique values.
// "end($allvalues)" is a way to get an arbitrary value from an array without needing to know a valid array key. For example, assuming $allvalues[0] exists may not be true.
if (count(array_flip($allvalues)) === 1 && end($allvalues) === 'true') {


}

または、不要なものの存在をテストするだけです:

if (in_array('false', $allvalues, true)) {

}

後者の方法は、はるかに効率的であるため、配列に含めることができる値が 2 つしかないことが確実な場合に優先します。しかし、疑わしい場合は、遅いプログラムの方が正しくないプログラムよりも優れているため、最初の方法を使用してください。

2 番目の方法を使用できない場合、配列が非常に大きく、配列の内容に複数の値が含まれている可能性があります (特に、2 番目の値が配列の先頭近くにある可能性が高い場合)。以下を実行する方がはるかに高速です。

/**
 * Checks if an array contains at most 1 distinct value.
 * Optionally, restrict what the 1 distinct value is permitted to be via
 * a user supplied testValue.
 *
 * @param array $arr - Array to check
 * @param null $testValue - Optional value to restrict which distinct value the array is permitted to contain.
 * @return bool - false if the array contains more than 1 distinct value, or contains a value other than your supplied testValue.
 * @assert isHomogenous([]) === true
 * @assert isHomogenous([], 2) === true
 * @assert isHomogenous([2]) === true
 * @assert isHomogenous([2, 3]) === false
 * @assert isHomogenous([2, 2]) === true
 * @assert isHomogenous([2, 2], 2) === true
 * @assert isHomogenous([2, 2], 3) === false
 * @assert isHomogenous([2, 3], 3) === false
 * @assert isHomogenous([null, null], null) === true
 */
function isHomogenous(array $arr, $testValue = null) {
    // If they did not pass the 2nd func argument, then we will use an arbitrary value in the $arr (that happens to be the first value).
    // By using func_num_args() to test for this, we can properly support testing for an array filled with nulls, if desired.
    // ie isHomogenous([null, null], null) === true
    $testValue = func_num_args() > 1 ? $testValue : reset($arr);
    foreach ($arr as $val) {
        if ($testValue !== $val) {
            return false;
        }
    }
    return true;
}

注:元の質問を(1)すべての値が同じかどうかを確認する方法と解釈する回答もあれば、(2)すべての値が同じかどうかを確認し、値がテスト値と等しいことを確認する方法と解釈する回答もあります。選択するソリューションは、その詳細に留意する必要があります。

私の最初の 2 つのソリューションは #2 と答えました。私のisHomogenous()関数は、2 番目の引数を渡すと #1 または #2 を返します。

于 2012-05-12T02:50:52.020 に答える
17

また、バイナリでない場合は、ヤギの答えを要約できます。

if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true') {
   // ...
}

if (array_unique($allvalues) === array('foobar')) { 
   // all values in array are "foobar"
}
于 2015-02-05T22:43:17.213 に答える
15

配列に文字列ではなく実際のブール値 (または int) が含まれている場合は、次を使用できますarray_sum

$allvalues = array(TRUE, TRUE, TRUE);
if(array_sum($allvalues) == count($allvalues)) {
    echo 'all true';
} else {
    echo 'some false';
}

http://codepad.org/FIgomd9X

が、およびとしてTRUE評価される ため、これは機能します。1FALSE0

于 2012-05-12T02:55:06.247 に答える
5

最小値と最大値を比較できます...最速の方法ではありません;p

$homogenous = ( min($array) === max($array) );
于 2017-05-25T12:05:39.740 に答える
0
$alltrue = 1;
foreach($array as $item) {
    if($item!='true') { $alltrue = 0; }
}
if($alltrue) { echo("all true."); }
else { echo("some false."); }

技術的には、これは「いくつかの誤り」をテストするのではなく、「すべてが正しいわけではない」ことをテストします。しかし、得られる値は「true」と「false」だけだと確信しているようです。

于 2012-05-12T02:53:21.913 に答える
0

別のオプション:

function same($arr) {
    return $arr === array_filter($arr, function ($element) use ($arr) {
        return ($element === $arr[0]);
    });
}

使用法:

same(array(true, true, true)); // => true
于 2014-01-23T22:07:17.793 に答える
-3
$x = 0;
foreach ($allvalues as $a) {
   if ($a != $checkvalue) {
      $x = 1;
   }
}

//then check against $x
if ($x != 0) {
   //not all values are the same
}
于 2012-05-12T02:54:59.893 に答える