PHP'de bir dizeyi boole değerine ayrıştırma


126

Bugün PHP ile oynuyordum ve "true" ve "false" dize değerlerinin bir koşulda boolean olarak doğru bir şekilde çözümlenmediğini keşfettim, örneğin aşağıdaki işlevi dikkate alarak:

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

Eğer yürütürsem:

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

Yalnızca "1" ve "0" değerleriyle çalışıyor gibi görünüyor:

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

PHP'de "true" ve "false" dizgileri boolean olarak ayrıştıran yerel bir işlev var mı?


Kodunuzda isBoolean("")yanlış döndürmelidir.
BoltClock

Eric Carson'un cevabına verilen kabul edilen cevabı değiştirmeyi düşünmelisiniz. Size istediğinizi yapan yerel bir işlevi gösterir.
Code Commander

1
PHP, dizenin ne dediğini düşünmez , "yanlış" hiçbir şey ifade etmeyen sadece beş karakterdir. Gerçi bunlar bir şeydir , bu yüzden boole değeri true, bir insan okuyucuya göre değerlendirilse de , bunun anlamı olduğundan daha sezgisel görünecektir FALSE.
zeel

Yanıtlar:


414

Bunu yapmak için PHP'nin filter_var yöntemini kullanan yerel bir PHP yöntemi vardır:

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);

Göre PHP'nin kılavuzu :

"1", "doğru", "açık" ve "evet" için DOĞRU döndürür. Aksi takdirde FALSE döndürür.

FILTER_NULL_ON_FAILURE ayarlanırsa, FALSE yalnızca "0", "false", "off", "no" ve "" için döndürülür ve boole olmayan tüm değerler için NULL döndürülür.


Bu kabul edilen cevap olmalıydı. Yerleşik PHP işlevleri, kendi işlevlerinizi oluşturmaktan daha iyidir. Tekerleği yeniden icat etmeye gerek yok! Ne yazık ki, çok geç: P
casraf

1
karşılaştırmanın değerini de küçültür mü?
Mobiletainment

3
@Mobiletainment, evet - bu $ değere (sahte, yanlış, yanlış, vb) için hayal herhangi kılıfı kolları
Eric Caron

Benim tarafımda Borked test çantası. Karşılaştırma için === yerine == kullanıldı. İnsanların kafasını karıştırmamak için önceki yorumumu kaldıracak.
andig

6
Eğer bayrak eklemek zorunda çünkü cevabı beni sinirlendiriyor FILTER_NULL_ON_FAILUREiçin filter_var()fonksiyonu ve ile değiştirin DEĞİL FILTER_VALIDATE_BOOLEANdüşündüğüm gibi. Bu benim için hile yapan aşağıdaki kodla sonuçlanacak:$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
Dragon54

14

Bunun nedeni, ve (boş dize) truedışında tüm dizelerin mantıksal değere dönüştürüldüğünde olarak değerlendirilmesidir ."0"""

Aşağıdaki işlev tam olarak istediğiniz şeyi yapacaktır: tam olarak PHP gibi davranır, ancak aynı zamanda dizeyi "false"şu şekilde değerlendirir false:

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

Belgeler şunu açıklıyor: http://php.net/manual/en/language.types.boolean.php :

Boolean'a dönüştürürken aşağıdaki değerler YANLIŞ olarak kabul edilir:

  • boole FALSE'un kendisi
  • tamsayı 0 (sıfır)
  • şamandıra 0.0 (sıfır)
  • boş dize ve "0" dizesi
  • sıfır elemanlı bir dizi
  • özel tip NULL (ayarlanmayan değişkenler dahil)
  • Boş etiketlerden oluşturulan SimpleXML nesneleri

Diğer her değer DOĞRU olarak kabul edilir (herhangi bir kaynak dahil).


2
+1 Güzel. (Oraya bir hırsız atabilirdi, ama bununla ilgili.)
John Parker

Bence middaparka, strtolower'ı ($ değer) 'false' ile karşılaştırmak anlamına geliyordu. Strtolower'a gerçek bir 'false' yazmak biraz .... saçmadır? :)
Paul Dixon

@Paul Dixon Yup, kastettiğim buydu. :-)
John Parker

2
@Marco - if ($ değer && strtolower ($ değer)! == "sahte") {Fransızca çalışıyorsanız; eğer ($ değer && strtolower ($ değer)! == "falsch") {almanca; eğer ($ değer && strtolower ($ değer)! == "onwaar") {Hollandaca ... PHP'nin neden standart olarak buna sahip olmadığını anlayabilirsiniz
Mark Baker

1
" boş olmayan tüm dizeler," 0 "dışında boole'ye dönüştürüldüğünde doğru olarak değerlendirilir."
BoltClock

5

Yalnızca PHP'de "0"veya boş dizge yanlışa zorlanır; diğer tüm boş olmayan dizeler doğru olmaya zorlar. Gönderen manuel :

Boolean'a dönüştürürken aşağıdaki değerler dikkate alınır FALSE:

  • boş dize ve "0" dizesi

Dizeleri "true"vs işlemek için kendi işlevinizi yazmanız gerekir "false". Burada, diğer her şeyin varsayılan olarak yanlış olduğunu varsayıyorum:

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

Kolayca kısaltılabilen bir yan notta

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

4

Son zamanlarda sorduğunuz gibi dizeleri (diğer şeylerin yanı sıra) işlemek için "gevşek" bir boole dönüştürme işlevine ihtiyacım vardı. Birkaç farklı yaklaşım buldum ve bunların üzerinden geçmek için büyük bir test verileri seti buldum . Hiçbir şey ihtiyaçlarıma tam olarak uymuyor, bu yüzden kendim yazdım:

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

Hem sayılabilir hem de dizge ile dönüştürülebilir nesneler için bu, doğruluğu belirlemek için sayıyı dizge değerine tercih edecektir. Yani, değerine bakılmaksızın $object instanceof Countablebu geri dönecekse .(boolean) count($object)(string) $object

Kullandığım test verilerinin davranışını ve diğer birkaç işlevin sonuçlarını burada görebilirsiniz . Bu küçük iframe'in sonuçlarını gözden geçirmek biraz zor, bu nedenle komut dosyası çıktısını tam sayfada görüntüleyebilirsiniz (bu URL belgelenmemiş olduğundan sonsuza kadar çalışmayabilir). Bu bağlantıların bir gün ölmesi durumunda , kodu pastebin'e de koyarım .

"Doğru olması gereken" ile olmaması gereken arasındaki çizgi oldukça keyfi; Kullandığım veriler ihtiyaçlarıma ve estetik tercihlerime göre kategorize edildi, sizinki farklılık gösterebilir.


Bu fonksiyon kusursuz çalışıyor, teşekkürler! Ancak bağlantılarınız artık 404.
servermanfail

3

Bu yapıyı, dizeleri boole'lere dönüştürmek için kullanıyorum, çünkü truediğer değerlerin çoğunu istiyorsun :

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

1

PHP'de "true" ve "false" dizgelerini boolean olarak ayrıştıran bir işlev var mı?

Hayır - ikisi de dizelerdir ve her ikisi de (dediğiniz gibi) değerlendirir true. falsePHP'de yalnızca boş dizeler olarak değerlendirilir .

Bunu manuel olarak test etmeniz gerekir. Mümkünse, bunun yerine "gerçek" boole değerleriyle çalışmak daha iyi olur.


1
Tüm dizeler truePHP'de olarak değerlendirilmez .
coreyward

1
Düzeltmiyor, sadece açıklığa kavuşturuyor. "Her ikisi de dizedir [ve değerlendir true]" demek yeni başlayanlara yanlış izlenim verebilir, özellikle de dizenin bir dize olduğu ve boolean'a dönüştürüldüğünde içeriğin önemli olmadığı daha katı yazım kurallarına sahip başka bir dilden biri (örneğin Yakut).
coreyward

1
"PHP'de yalnızca boş dizeler yanlış olarak değerlendirilir." Peki ya boş olmayan dizge "0"? Bu da değerlendirilmiyor falsemu?
Sepster

0

Güvenli bir şekilde boolean'a dönüştürmenin en kolay yolu;

    $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

API'niz yalnızca "true" veya "false" dizelerini kabul ediyorsa, diğer her şey halinenull gelirse, şunu deneyin:

$boolean = ['true' => true, 'false' => false][$inputString] ?? null;

Bu $input, bunun bir nesne olmadığını varsayar . Null coalesce ( ??) PHP 7.0'da tanıtıldı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.