используя array_map для проверки значений? - PullRequest
1 голос
/ 16 декабря 2009

Можно ли использовать 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.

Ответы [ 5 ]

4 голосов
/ 16 декабря 2009

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), чтобы узнать, есть ли какие-либо ложные значения.

2 голосов
/ 16 декабря 2009

Я обычно большой сторонник array_map(), array_filter() и т. Д., Но в этом случае foreach() будет лучшим выбором. Причина в том, что с array_map() и другими он будет проходить через весь массив, несмотря ни на что. Но для ваших целей вам нужно только пройти через массив, пока вы не встретите значение, для которого is_numeric() возвращает false, и, насколько я знаю, в PHP нет способа вырваться из этих методов.

Другими словами, если в вашем массиве 1000 элементов, а пятый не числовой, то при использовании array_map() все равно будут проверяться оставшиеся 995 значений, даже если вы уже знаете, что массив не прошел тест. Но если вместо этого вы используете foreach () и имеете break на is_numeric() == false, вам нужно будет проверить только эти первые пять элементов.

1 голос
/ 16 декабря 2009

У меня есть две крошечные, но чрезвычайно полезные функции в моей «стандартной библиотеке»

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";
1 голос
/ 16 декабря 2009

Вы можете использовать фильтр, но он заканчивается ужасным кусочком кода

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

И пользуйся вот так

$isAllNumeric = array_find($arr, function($x){return !is_numeric($x);})) !== false;
0 голосов
/ 16 декабря 2009

Более элегантный подход ИМХО :

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

 else
 {
  echo "FALSE\n";
 }
}

Возвращается значение true, если все значения являются числовыми, и значение false, если любое из значений не является числовым.

...