2011-01-23 34 views
89

Hôm nay tôi đã chơi với PHP và tôi phát hiện ra rằng các giá trị chuỗi "true" và "false" không được phân tích cú pháp chính xác thành boolean trong điều kiện, ví dụ như xem xét hàm sau:Phân tích chuỗi thành giá trị boolean trong PHP

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

Nếu tôi thực hiện:

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

Nó dường như chỉ để làm việc với "1" và "0" giá trị:

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

Có một hàm gốc trong PHP để phân tích các chuỗi "true" và "false" thành boolean không?

+0

Trong mã của bạn, 'isBoolean (" ")' phải trả về false. – BoltClock

+0

@BoltClock được cập nhật, thx – Mark

+0

Bạn nên cân nhắc việc thay đổi câu trả lời được chấp nhận cho câu trả lời của Eric Caron. Nó cho bạn thấy một chức năng bản địa làm những gì bạn yêu cầu. –

Trả lời

306

Có một phương pháp PHP mẹ đẻ để làm điều này trong đó sử dụng phương pháp filter_var PHP:

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN); 

Theo nhãn hiệu của PHP:

Returns tRUE cho "1", "true", "trên" và "y es ". Trả về FALSE nếu không.

Nếu FILTER_NULL_ON_FAILURE được đặt, FALSE chỉ được trả lại cho "0", "sai", "tắt", "không" và "" và NULL được trả về cho tất cả các giá trị không phải boolean.

+0

Điều này đáng lẽ phải là câu trả lời được chấp nhận. Được xây dựng trong các chức năng PHP là tốt hơn so với xây dựng của riêng bạn. Không cần phải sáng chế lại bánh xe! Quá tệ, đã quá trễ: P – casraf

+0

có làm giảm giá trị của so sánh không? – Mobiletainment

+2

@Mobiletainment, vâng - nó xử lý bất kỳ vỏ bọc nào bạn có thể tưởng tượng với giá trị $ (false, FALSE, FalSe, v.v.) –

12

Lý do là tất cả các chuỗi đánh giá là true khi chuyển đổi chúng thành boolean, ngoại trừ "0""" (chuỗi rỗng).

Chức năng sau đây sẽ làm chính xác những gì bạn muốn: nó giống hệt với PHP, nhưng cũng sẽ đánh giá chuỗi "false" như false:

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

Các tài liệu giải thích rằng: http://php.net/manual/en/language.types.boolean.php:

Khi chuyển đổi sang boolean, các giá trị sau được coi là FALSE:

  • các FALSE boolean tự
  • số nguyên 0 (zero)
  • phao 0.0 (zero)
  • chuỗi rỗng, và chuỗi "0"
  • một mảng với zero yếu tố
  • sự NULL loại đặc biệt (bao gồm cả các biến unset)
  • đối tượng SimpleXML tạo từ thẻ trống

Mọi giá trị khác được coi là TRUE (bao gồm bất kỳ tài nguyên nào).

+1

+1 Tốt. (Có thể chuck một strtolower trong đó, nhưng đó là về nó.) –

+0

Tôi nghĩ rằng middaparka có nghĩa là so sánh strtolower ($ value) với 'false'. Vượt qua một chữ 'giả' thành strtolower là một chút .... daft? :) –

+0

@Paul Dixon Yup, đó là những gì tôi đang đề cập đến. :-) –

4

Trong PHP chỉ "0" hoặc chuỗi rỗng buộc phải giả; mọi chuỗi không trống khác coerces thành true. Từ manual:

Khi chuyển sang boolean, các giá trị sau đây được coi FALSE:

  • chuỗi rỗng, và chuỗi "0"

Bạn cần phải viết chức năng của riêng bạn để xử lý các chuỗi "true" vs "false".Ở đây, tôi cho rằng tất cả mọi thứ mặc định khác false:

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

Trên một mặt lưu ý rằng có thể dễ dàng được ngưng tụ để

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

Có một hàm trong PHP để phân tích "true" và "false "chuỗi thành boolean?

Không - cả hai đều là chuỗi và cả hai (như bạn nói) đánh giá là true. Chỉ các chuỗi rỗng được đánh giá là false trong PHP.

Bạn sẽ cần phải kiểm tra điều này theo cách thủ công. Tuy nhiên, nếu có thể, sẽ tốt hơn nếu làm việc với các giá trị boolean "thực" thay thế.

+1

Không phải tất cả các chuỗi đều đánh giá 'true' trong PHP. – coreyward

+1

Không sửa chữa, chỉ cần làm rõ. Nói "cả hai là chuỗi [và đánh giá là' true'] "có thể cung cấp cho người mới một ấn tượng sai, đặc biệt là từ một ngôn ngữ khác với quy tắc nhập chặt hơn trong đó chuỗi là một chuỗi và nội dung không quan trọng khi nó được chuyển đổi thành boolean (như Ruby). – coreyward

+1

@corey công bằng đủ, điểm tốt. Tôi sẽ làm rõ trong các văn bản –

3

Tôi đang sử dụng cấu trúc này để morph dây vào dữ liệu boolean, kể từ khi bạn muốn true đối với hầu hết các giá trị khác:

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

Gần đây, tôi cần một hàm boolean "lỏng lẻo" để xử lý các chuỗi như chuỗi bạn đang hỏi (trong số những thứ khác). I found a few different approaches and came up with a big set of test data to run through them. Không có gì khá phù hợp với nhu cầu của tôi vì vậy tôi đã viết của riêng tôi:

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

Lưu ý rằng các đối tượng đó đều đếm được và chuỗi-cast được, điều này sẽ hỗ trợ việc đếm trên chuỗi giá trị để xác định truthiness. Tức là, nếu $object instanceof Countable, điều này sẽ trả lại (boolean) count($object) bất kể giá trị của (string) $object.

Bạn có thể xem hành vi của dữ liệu thử nghiệm mà tôi đã sử dụng cũng như kết quả cho một số chức năng khác here. Thật khó để bỏ qua kết quả từ iframe nhỏ đó, vì vậy bạn có thể view the script output in a full page, thay vào đó (URL đó không có giấy tờ để điều này có thể không hoạt động mãi mãi). Trong trường hợp các liên kết đó chết một ngày nào đó, thì cũng cần I put the code up on pastebin.

Đường thẳng giữa những gì "phải là đúng" và những gì không nên là khá tùy ý; dữ liệu tôi sử dụng được phân loại dựa trên nhu cầu và sở thích thẩm mỹ của tôi, dữ liệu của bạn có thể khác nhau.

0

Cách dễ nhất để chuyển đổi thành boolean một cách an toàn;

$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' 
Các vấn đề liên quan