2009-12-16 2 views
1

array_map()을 사용하여 배열 값을 테스트 할 수 있습니까? 배열의 모든 요소가 숫자인지 확인하려고합니다.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 루프에서 원하는 기능을 얻을 수 있다는 것을 알고 있습니다.

답변

4

array_map은 배열을 반환합니다. 그래서 항상 '사실'로 간주됩니다. 이제 array_search이 FALSE 인 경우 욕망의 영향을받을 수 있습니다. PHP.net Page

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

이에서

현재는 true 또는 각 요소에 대해 false를 포함하는 배열을 가지고 있다는 것을 의미한다. false 값이 있는지 알아 보려면 array_search(false,$array)을 사용해야합니다.

1

당신은 필터를 사용할 수 있지만 그것은 조금 더 나은 만드는 사용자 정의 함수를 사용하여 코드

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

의 끔찍한 비트와 함께 끝,하지만 여전히 완벽하지

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

하지만 경우 array_reduce 커스텀 함수를 사용하고 있었지만 여전히 실패했다.

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

그리고 나는 보통 등 array_map()의 큰 옹호, array_filter(), 해요,하지만이 경우 foreach()가 너무

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

PHP의 가능성을 한눈에 파악하고 PHP를 더 멋지게 확장하십시오! – xtofl

+0

왜 downvote? – Yacoby

2

처럼 사용 :이 같은 함수를 작성해야합니다 최선의 선택이 될 것입니다. 그 이유는 array_map() 등으로 무엇이든 전체 어레이를 통과하기 때문입니다. 그러나 당신의 목적을 위해서라면, is_numeric()이 거짓을 반환하는 값으로 실행될 때까지 배열을 통과하면됩니다. 그리고 PHP에서 이러한 메소드를 벗어날 방법이 없다는 것을 알고 있습니다. 즉

, 당신은 당신의 배열에 1,000 항목을 가지고 5 일 이미 배열이 테스트를 통과하지 못할 것을 알면서도 array_map()이 여전히 남아있는 995의 값을 확인합니다 사용, 숫자가 아닌 경우. 하지만 대신 foreach()를 사용하여 breakis_numeric() == false에 올린다면 처음 다섯 요소 만 확인하면됩니다.

+0

이것은 좋은 충고입니다 * * Chacha는 array_map이 항상 배열을 반환한다고 말합니다. "아니오, 당신이 만난다면 하나의 FALSE 값을주지 않기 때문에 원하는대로 사용할 수 없습니다. 비 숫자 요소 "라고합니다. 어쨌든 foreach()를 사용해야 할 것입니다. break를 사용하면 매우 좋은 조언입니다. :) – user151841

1

나는 당신의 예에서 내 "표준 라이브러리"

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"; 
+0

그 모습이 편리합니다. Jordan의 의견에 따라,'any'() 함수에'break' 문을 추가 할 때의 가치를 보시겠습니까? – user151841

+1

이 경우는 no입니다. 왜냐하면 return은 break처럼 동작을 멈추기 때문입니다. –

0

더 우아한 방법 이럴 :

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

else 
{ 
    echo "FALSE\n"; 
} 
} 

모든 값이 숫자이면 true를 반환하고 false이면 false를 반환합니다. 모든 값은 숫자가 아닙니다.

관련 문제