it-swarm.asia

تحليل سلسلة في قيمة منطقية في PHP

اليوم كنت ألعب مع PHP ، واكتشفت أن قيم السلسلة "صواب" و "خطأ" لا يتم تحليلها بشكل صحيح إلى منطقية في حالة ، على سبيل المثال النظر في الوظيفة التالية:

function isBoolean($value) {
   if ($value) {
      return true;
   } else {
      return false;
   }
}

إذا قمت بالتنفيذ:

isBoolean("true") // Returns true
isBoolean("") // Returns false
isBoolean("false") // Returns true, instead of false
isBoolean("asd") // Returns true, instead of false

يبدو أنه يعمل فقط مع القيم "1" و "0":

isBoolean("1") // Returns true
isBoolean("0") // Returns false

هل هناك دالة أصلية في PHP لتحليل السلاسل "الحقيقية" و "الخاطئة" في منطقية؟

112
Mark

هناك طريقة أصلية PHP للقيام بذلك والتي تستخدم طريقة filter_var الخاصة بـ PHP:

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);

حسب دليل PHP :

إرجاع TRUE لـ "1" ، "true" ، "on" و "yes". إرجاع FALSE خلاف ذلك.

إذا تم تعيين FILTER_NULL_ON_FAILURE ، فسيتم إرجاع FALSE فقط من أجل "0" و "false" و "off" و "no" و "" ، ويتم إرجاع NULL لجميع القيم غير المنطقية.

372
Eric Caron

السبب هو أن جميع السلاسل تقيم على true عند تحويلها إلى منطقية ، باستثناء "0" و "" (سلسلة فارغة).

ستعمل الوظيفة التالية كما تريد بالضبط: تتصرف تمامًا مثل PHP ، لكنها ستقيم أيضًا السلسلة "false" كـ false:

function isBoolean($value) {
   if ($value && strtolower($value) !== "false") {
      return true;
   } else {
      return false;
   }
}

تشرح الوثائق ما يلي: http://php.net/manual/ar/language.types.boolean.php :

عند التحويل إلى منطقي ، تعتبر القيم التالية FALSE:

  • المنطقية كاذبة نفسها
  • عدد صحيح 0 (صفر)
  • العائمة 0.0 (صفر)
  • السلسلة الفارغة و السلسلة "0"
  • مجموعة مع عناصر الصفر
  • النوع الخاص NULL (بما في ذلك متغيرات unset)
  • كائنات SimpleXML تم إنشاؤها من علامات فارغة

تعتبر كل قيمة أخرى صحيحة (بما في ذلك أي مورد).

14
Arnaud Le Blanc

في PHP فقط "0" أو السلسلة الفارغة تضطر إلى false ؛ كل سلسلة أخرى غير فارغة coerces إلى صحيح. من دليل :

عند التحويل إلى منطقي ، تعتبر القيم التالية FALSE:

  • السلسلة الفارغة ، والسلسلة "0"

تحتاج إلى كتابة وظيفتك الخاصة للتعامل مع السلاسل "true" vs "false". هنا ، أفترض أن كل شيء آخر غير صحيح:

function isBoolean($value) {
   if ($value === "true") {
      return true;
   } else {
      return false;
   }
}

في ملاحظة جانبية يمكن بسهولة تلخيصها

function isBoolean($value) {
   return $value === "true";
}
5
BoltClock

كنت بحاجة مؤخرًا إلى وظيفة تحويل منطقية "فضفاضة" للتعامل مع السلاسل مثل تلك التي تسأل عنها (من بين أشياء أخرى). لقد وجدت بعض الطرق المختلفة وخرجت بمجموعة كبيرة من بيانات الاختبار لأعمل عليها . لا يوجد شيء يلبي احتياجاتي تمامًا ، لذا كتبت احتياجاتي:

function loosely_cast_to_boolean($value) {
    if(is_array($value) || $value instanceof Countable) {
        return (boolean) count($value);
    } else if(is_string($value) || is_object($value) && method_exists($value, '__toString')) {
        $value = (string) $value;
        // see http://www.php.net/manual/en/filter.filters.validate.php#108218
        // see https://bugs.php.net/bug.php?id=49510
        $filtered = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
        if(!is_null($filtered)) {
            return $filtered;
        } else {
            // "none" gets special treatment to be consistent with ini file behavior.
            // see documentation in php.ini for more information, in part it says: 
            // "An empty string can be denoted by simply not writing anything after 
            // the equal sign, or by using the None keyword".
            if(strtolower($value) === 'none') {
                $value = '';
            }
            return (boolean) $value;
        }
    } else {
        return (boolean) $value;
    }
}

لاحظ أنه بالنسبة للكائنات القابلة للعد والسلسلة ، فإن هذا سيفضل العد على قيمة السلسلة لتحديد الصدق. هذا إذا ، $object instanceof Countable ، فسوف يُرجع ذلك (boolean) count($object) بغض النظر عن قيمة (string) $object.

يمكنك رؤية سلوك بيانات الاختبار التي استخدمتها بالإضافة إلى نتائج العديد من الوظائف الأخرى هنا . من الصعب تحديد النتائج من إطار iframe الصغير ، بحيث يمكنك عرض إخراج البرنامج النصي في صفحة كاملة ، بدلاً من ذلك (عنوان URL هذا غير موثق ، وبالتالي قد لا يعمل هذا إلى الأبد). في حالة وفاة تلك الروابط في يوم ما ، قمت بوضع الشفرة على Pastebin أيضًا.

الخط الفاصل بين ما "يجب أن يكون صحيحًا" وما لا يجب أن يكون تعسفيًا إلى حد ما ؛ يتم تصنيف البيانات التي استخدمتها بناءً على احتياجاتي وتفضيلاتي الجمالية ، فقد تختلف احتياجاتك.

4
Matt Kantor

أستخدم هذه البنية لتحويل السلاسل إلى منطقية ، حيث تريد true لمعظم القيم الأخرى:

$str = "true";
$bool = !in_array($str, array("false", "", "0", "no", "off"));
3
mario

هل هناك دالة في PHP لتحليل السلاسل "الحقيقية" و "الخاطئة" في منطقية؟

لا - كلاهما عبارة عن سلاسل ، وتلك (كما تقول) تقيّم بـ true. يتم تقييم السلاسل الفارغة فقط بـ false في PHP.

سوف تحتاج إلى اختبار لهذا يدويا. إذا كان ذلك ممكنًا ، فمن الأفضل العمل مع القيم المنطقية "الحقيقية" بدلاً من ذلك.

1
Pekka 웃

أسهل طريقة لتحويل بأمان إلى منطقية.

    $flag = 'true';

    if( filter_var( $flag,FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE ) !== null) {
      $flag = filter_var($flag,FILTER_VALIDATE_BOOLEAN);
    }

    gettype($flag); // Would Return 'Boolean'
    echo 'Val: '.$flag; // Would Output 'Val: 1'
0
Timothy Perez