문제

Array_Map ()를 사용하여 배열 값을 테스트 할 수 있습니까? 배열의 모든 요소가 숫자인지 확인하고 싶습니다.

나는 둘 다 시도했다

$arrays = array(
         array(0,1,2,3 )
        , array ( 0,1, "a", 5 )
);

foreach ( $arrays as $arr ) {

        if ( array_map("is_numeric", $arr) === FALSE ) {
                echo "FALSE\n";
        } else {
                echo "TRUE\n";
        }
}

그리고

$arrays = array(
         array(0,1,2,3 )
        , array ( 0,1, "a", 5 )
);

foreach ( $arrays as $arr ) {

        if ( ( array_map("is_numeric", $arr) ) === FALSE ) {
                echo "FALSE\n";
        } else {
                echo "TRUE\n";
        }
}

그리고 둘 다 얻습니다

TRUE
TRUE

이 작업을 수행 할 수 있습니까? 그렇다면 내가 뭘 잘못하고 있니?

참고 : Foreach 루프에서 원하는 기능을 얻을 수 있다는 것을 알고 있습니다.

도움이 되었습니까?

해결책

Array_map은 배열을 반환합니다. 따라서 항상 '진실'으로 간주됩니다. 이제, 당신이 array_search 거짓의 경우 욕망 효과를 얻을 수 있습니다.

로부터 php.net 페이지

array_map() returns an array containing all the elements of 
arr1 after applying the callback function to each one.

이것은 현재 각 요소에 대해 true 또는 false를 포함하는 배열이 있음을 의미합니다. 사용해야합니다 array_search(false,$array) 잘못된 값이 있는지 알아 내기 위해.

다른 팁

나는 보통 큰 옹호자입니다 array_map(), array_filter(), 등, 그러나이 경우 foreach() 최선의 선택이 될 것입니다. 그 이유는 array_map() 그리고 다른 사람들은 무엇이든 관계없이 전체 배열을 통과 할 것입니다. 그러나 당신의 목적 상, 당신은 당신이 그 값을 가질 때까지 배열을 통과하면됩니다. is_numeric() 거짓을 반환하고, 내가 아는 한, PHP에는 그 방법에서 벗어날 방법이 없다.

다시 말해, 배열에 1,000 개의 항목이 있고 5 번째 항목이 숫자가 아닌 경우 array_map() 배열이 이미 테스트를 통과하지 못한다는 것을 알고 있지만 나머지 995 값을 확인합니다. 그러나 대신 oreach ()를 사용하고 break ~에 is_numeric() == false, 그러면 처음 다섯 가지 요소 만 확인하면됩니다.

필터를 사용할 수 있지만 끔찍한 코드로 끝납니다.

$isAllNumeric = count(array_filter($arr, "is_numeric")) === count($arr)

사용자 정의 기능을 사용하면 조금 더 좋지만 여전히 완벽하지는 않습니다.

$isAllNumeric = count(array_filter($arr, function($x){return !is_numeric($x);})) === 0

그러나 사용자 정의 함수를 사용하고 있다면 Array_Reeduce가 작동하지만 여전히 약간의 실패가 있습니다.

$isAllNumeric = array_reduce($arr,
                             function($x, $y){ return $x && is_numeric($y); },
                             true);

실패는 그것이 원하는 것을 발견했을 때 깨지지 않기 때문에 위의 기능적 제안은 그다지 효율적이지 않다는 것입니다. 다음과 같은 기능을 작성해야합니다.

function array_find(array $array, $callback){
    foreach ($array as $x){ //using iteration as PHP fails at recursion
        if ( call_user_func($callback, array($x)) ){
            return $x;
        }
    }
    return false;
}

그리고 그렇게 사용하십시오

$isAllNumeric = array_find($arr, function($x){return !is_numeric($x);})) !== false;

"표준 라이브러리"에 작지만 매우 유용한 기능이 두 가지 있습니다.

function any($ary, $func) {
   foreach($ary as $val)
      if(call_user_func($func, $val)) return true;
   return false;
}

function all($ary, $func) {
   foreach($ary as $val)
      if(!call_user_func($func, $val)) return false;
   return true;
}

당신의 예에서

 foreach ( $arrays as $arr )
    echo all($arr, 'is_numeric') ? "ok" : "not ok";

더 우아한 접근 IMHO:

foreach ($arrays as $array)
{
 if (array_product(array_map('is_numeric', $array)) == true)
 {
  echo "TRUE\n";
 }

 else
 {
  echo "FALSE\n";
 }
}

값이 숫자가 아닌 경우 모든 값이 숫자이고 False 인 경우 TRUE가 반환됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top