// 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') {
}
/**
* 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;
}
$arr = [5,5,5,5,5];
$flag = 0;
$firstElement = $arr[0];
foreach($arr as $val){
// CHECK IF THE FIRST ELEMENT DIFFERS FROM ANY OTHER ELEMENT IN THE ARRAY
if($firstElement != $val){
// FIRST MISMATCH FOUND. UPDATE FLAG VALUE AND BREAK OUT OF THE LOOP.
$flag = 1;
break;
}
}
if($flag == 0){
// ALL THE ELEMENTS ARE SAME... DO SOMETHING
}else{
// ALL THE ELEMENTS ARE NOT SAME... DO SOMETHING
}
9条答案
按热度按时间ttygqcqt1#
所有值均等于试验值:
或者只是测试你不想要的东西是否存在
如果你确信数组中只有两个可能的值,那么就选择后一种方法,因为它效率更高。但是如果你不确定,那么一个缓慢的程序总比一个不正确的程序好,所以使用第一种方法。
如果不能使用第二种方法,您的数组非常大,并且数组的内容 * 很可能 * 具有多个值(尤其是如果第二个值很可能出现在数组开头附近),则执行以下操作可能会 * 快得多 *:
注意:一些答案将原始问题解释为(1)如何检查所有值是否相同,而其他答案将其解释为(2)如何检查所有值是否相同和确保值等于测试值。您选择的解决方案应注意该细节。
我的前两个解决方案的答案是#2。我的
isHomogenous()
函数的答案是#1,或者如果传递第二个arg,答案是#2。g2ieeal72#
为什么不在调用
array_unique()
后比较count呢?若要检查数组中的所有元素是否相同,应简单如以下所示:
无论数组中值的类型如何,这都应该有效。
gcxthw6b3#
另外,如果goat的答案不是二进制的,你可以将其浓缩:
到
8tntrjer4#
如果数组包含实际的布尔值(或int)而不是字符串,则可以使用
array_sum
:http://codepad.org/FIgomd9X
这是因为
TRUE
将被计算为1
,FALSE
将被计算为0
。pb3s4cty5#
你可以比较最小值和最大值...不是最快的方法; p
tpgth1q76#
从技术上讲,这不是测试“一些错误”,而是测试“不全正确”,但听起来你很确定你得到的值只有“正确”和“错误”。
35g0bw717#
另一种选择:
用法:
2ic8powd8#
回答我的2023年的寻人方法。
在一个所有元素都相同的数组中,所有元素都必须与数组的第一个元素匹配,这应该总是正确的。记住这个逻辑,我们可以得到数组的第一个元素,并迭代数组中的每个元素,以检查循环中的第一个元素是否与数组中的第一个元素不匹配。如果找到,我们将改变标志值并立即跳出循环。2否则,循环将继续直到结束。3稍后,在循环之外,我们可以使用这个标志值来判断数组中的所有元素是否相同。
这个解决方案对于有明确元素限制的数组(小数组)很好。但是,考虑到我们要遍历每个元素来检查第一个收支平衡点,我不确定这个解决方案对于有大量元素的数组有多好。请根据您自己的方便和判断使用这个解决方案。
hi3rlvi29#