programing

배열의 모든 값이 동일한지 확인합니다.

lastmoon 2023. 8. 20. 12:26
반응형

배열의 모든 값이 동일한지 확인합니다.

배열의 모든 값이 동일한지 확인해야 합니다.

예:

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

배열의 모든 값이 같은 경우'true'그럼 나는 메아리치고 싶어요.'all true'배열의 값이 같은 경우'false'그럼 나는 메아리치고 싶어요.'some false'

어떻게 해야 할지 생각나는 거 있어요?

모든 값이 검정 값과 같습니다.

// 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개뿐이라면 후자의 방법을 선호합니다. 훨씬 더 효율적이기 때문입니다.하지만 확실하지 않다면, 잘못된 프로그램보다 느린 프로그램이 더 낫기 때문에 첫 번째 방법을 사용하십시오.

두 번째 방법을 사용할 수 없고 배열이 매우 크며 배열의 내용이 1개 이상의 값을 가질 가능성이 높은 경우(특히 두 번째 값이 배열의 시작 부분 근처에서 발생할 가능성이 높은 경우) 다음을 수행하는 것이 훨씬 빠를 수 있습니다.

/**
 * 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()함수는 #1 또는 #2에 답합니다. 만약 당신이 두 번째 인수를 통과한다면.

전화를 건 후에 숫자를 비교하는 것이 어떻습니까?array_unique()?

배열의 모든 요소가 동일한지 확인하려면 다음과 같이 단순해야 합니다.

$allValuesAreTheSame = (count(array_unique($allValues, SORT_REGULAR)) === 1);

이것은 배열의 값 유형에 관계없이 작동해야 합니다.

업데이트: 추가됨SORT_REGULARYann Chabot이 지적한 암묵적인 유형 캐스팅을 피하기 위한 플래그

또한 염소가 이진수가 아닌 경우 염소의 대답을 요약할 수 있습니다.

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

로.

if (array_unique($allvalues) === array('foobar')) { 
   // all values in array are "foobar"
}

배열에 문자열 대신 실제 부울(또는 int)이 포함된 경우 다음을 사용할 수 있습니다.

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

http://codepad.org/FIgomd9X

이는 다음과 같은 이유로 작동합니다.TRUE로 평가됩니다.1,그리고.FALSE~하듯이0.

최소값과 최대값을 비교할 수 있습니다.가장 빠른 방법이 아님 ;p

$homogenous = ( min($array) === max($array) );

다른 옵션:

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

용도:

same(array(true, true, true)); // => true
$alltrue = 1;
foreach($array as $item) {
    if($item!='true') { $alltrue = 0; }
}
if($alltrue) { echo("all true."); }
else { echo("some false."); }

엄밀히 말하면 이것은 "일부 거짓"을 테스트하는 것이 아니라 "모든 것이 진실은 아니다"를 테스트합니다.하지만 여러분이 얻을 수 있는 값은 '참'과 '거짓'뿐이라고 꽤 확신하는 것처럼 들립니다.

2023년에 검색하는 사람들을 위한 나의 방법에 답합니다.

$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
}

모든 요소가 동일한 배열에서는 모든 요소가 배열의 첫 번째 요소와 일치해야 합니다.이 논리를 염두에 두고 배열의 첫 번째 요소를 가져오고 배열의 각 요소를 반복하여 배열의 첫 번째 요소와 일치하지 않는 루프의 첫 번째 요소를 확인할 수 있습니다.발견되면 플래그 값을 변경하여 즉시 루프를 해제합니다.그렇지 않으면 루프가 끝까지 계속됩니다.나중에 루프 외부에서 이 플래그 값을 사용하여 배열의 모든 요소가 동일한지 여부를 확인할 수 있습니다.

이 솔루션은 요소의 한계가 확실한 배열(작은 배열)에 적합합니다.그러나 첫 번째 손익분기점을 확인하기 위해 각 요소를 반복적으로 확인하고 있다는 점을 고려할 때 요소 수가 매우 많은 어레이에 이 솔루션이 얼마나 적합한지는 잘 모르겠습니다.이 솔루션은 사용자의 편의와 판단에 따라 사용하십시오.

$x = 0;
foreach ($allvalues as $a) {
   if ($a != $checkvalue) {
      $x = 1;
   }
}

//then check against $x
if ($x != 0) {
   //not all values are the same
}

언급URL : https://stackoverflow.com/questions/10560658/check-if-all-values-in-array-are-the-same

반응형