سؤال

هل من الممكن استخدام 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.

هذا يعني أن لديك حاليا صفيف يحتوي على صواب أو خطأ لكل عنصر. سوف تحتاج إلى استخدام array_search(false,$array) لمعرفة ما إذا كان هناك أي قيم كاذبة.

نصائح أخرى

أنا عادة محامي كبير array_map(), array_filter(), ، إلخ، ولكن في هذه الحالة foreach() سيكون أفضل خيار. السبب هو ذلك مع array_map() والبعض الآخر سوف يذهب من خلال مجموعة كاملة بغض النظر عن ما. ولكن لأغراضك تحتاج فقط إلى الذهاب من خلال الصفيف حتى يتم تشغيلها إلى قيمة is_numeric() إرجاع FALSE، وبقدر ما أعرف أنه لا توجد طريقة في PHP للخروج من تلك الأساليب.

وبعبارة أخرى، إذا كان لديك 1000 عنصر في صفيفك و 5th One غير رقمي، باستخدام array_map() ستظل تحقق من قيم 995 المتبقية على الرغم من أنك تعرف بالفعل مجموعة لا تمر بإجراء الاختبار الخاص بك. ولكن إذا كنت تستخدم foreach () بدلا من ذلك 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_Rureuce، لكنها لا تزال لديها بعض الإخفاشات.

$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 إذا كانت أي من القيم غير رقمي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top