Trong php, 0 được coi là rỗng?


143

Mã sẽ giải thích thêm:

$var = 0;

if (!empty($var)){
echo "Its not empty";
} else {
echo "Its empty";
}

Kết quả trả về "Nó trống rỗng". Tôi nghĩ trống () sẽ kiểm tra xem tôi đã đặt biến và có giá trị bên trong chưa. Tại sao nó trả về "Nó trống rỗng" ??


15
@st bd emptycó lẽ là hàm PHP hữu ích nhất nhưng bị hiểu lầm rộng rãi. Tìm hiểu làm thế nào và khi nào sử dụng nó.
lừa dối

2
@st bd emptyvề cơ bản là viết tắt của isset($var) && $var != false. Bạn phải cầm thứ emptyrất kỳ lạ để tự bắn vào chân mình bằng thứ này. ; P
lừa dối

@st bd 1) Nó "không nhất quán" ở đâu? Nó hoạt động như nó nói trên tin. 2) So sánh lỏng lẻo một biến với falsemà không gây ra lỗi "biến không xác định" là vô ích? Ồ, đoán xem bạn không bao giờ làm điều này 3) Chọn chức năng sai trong ngữ cảnh bảo mật không có nghĩa là chính chức năng đó là xấu, vô dụng hoặc không nhất quán; nó chỉ có nghĩa là ai đó đã chọn sai chức năng cho công việc.
lừa dối


18
@deceze - Nếu một hàm bị hiểu nhầm rộng rãi như vậy empty(), thì nó có thể có tên sai.
martinstoeckli

Câu trả lời:


189

http://php.net/empty

Những điều sau đây được coi là trống rỗng:

  • "" (một chuỗi trống)
  • 0 (0 dưới dạng số nguyên)
  • 0,0 (0 dưới dạng nổi)
  • "0" (0 dưới dạng chuỗi)
  • VÔ GIÁ TRỊ
  • SAI
  • mảng () (một mảng trống)
  • var $ var; (một biến được khai báo, nhưng không có giá trị trong một lớp)

Lưu ý rằng đây chính xác là cùng một danh sách như đối với một sự ép buộc đối với Boolean false. emptychỉ đơn giản là !isset($var) || !$var. Hãy thử issetthay thế.


Vì vậy, tôi phải kiểm tra như thế này: if (isset ($ var) && $ var! = 0) {Do Something} ??
mysqllearner

1
@mysql Trong trường hợp này bạn cũng có thể sử dụng !empty($var), nhưng lưu ý rằng điều đó không giống với những gì bạn đã viết trong câu hỏi. Những gì để sử dụng phụ thuộc hoàn toàn vào những giá trị bạn muốn coi là true. Chỉ cần so sánh sự khác biệt giữa issetemptychọn kết hợp đúng cho tình huống phù hợp.
lừa dối

7
@mysqllearner: issettrả về Truenếu $var=0. Nhưng những gì bạn muốn nói if(isset($var) && $var != 0)cũng giống nhưempty
Felix Kling

@mysqllearner ngay lập tức phát hiện nếu nó KHÔNG trống. để kiểm tra xem nó có trống không, thay vào đó hãy sử dụng!

1
@Deji Vì PHP có nguồn gốc là ngôn ngữ web và các giá trị trong các yêu cầu HTTP luôn là các chuỗi, '0'nên được coi là tương đương với 0. Đó là một triết lý thiết kế cốt lõi của PHP. Tôi đồng ý rằng đây là một lựa chọn cực kỳ gây tranh cãi, tuy nhiên, tôi không ở đây để tranh luận về lựa chọn đó với bạn. Trong logic của PHP, emptytương đương với các == falsethông báo trừ là IMO tốt. Rằng một số thứ nên rất khác trong PHP so với chúng là một chủ đề khác.
lừa dối

76

Tôi đã tự hỏi tại sao không ai đề xuất bảng so sánh Loại cực kỳ tiện dụng . Nó trả lời mọi câu hỏi về các hàm phổ biến và so sánh các toán tử.

Một đoạn:

Expression      | empty($x)
----------------+--------
$x = "";        | true    
$x = null       | true    
var $x;         | true    
$x is undefined | true    
$x = array();   | true    
$x = false;     | true    
$x = true;      | false   
$x = 1;         | false   
$x = 42;        | false   
$x = 0;         | true    
$x = -1;        | false   
$x = "1";       | false   
$x = "0";       | true    
$x = "-1";      | false   
$x = "php";     | false   
$x = "true";    | false   
$x = "false";   | false   

Cùng với các cheatheets khác, tôi luôn giữ một bản cứng của bàn này trên bàn trong trường hợp tôi không chắc chắn


2
bạn nên cập nhật cheat sheet của bạn bây giờ tôi sẽ cung cấp cho bạn một số chi tiết ... 0.0 = true, 0.00 = true, "0.0" = false
Sayed Mohd Ali

34

Trong trường hợp giá trị số, bạn nên sử dụng hàm is_numeric:

$var = 0;

if (is_numeric($var))
{
  echo "Its not empty";
} 
else 
{
    echo "Its empty";
}

1
Cách giải quyết tốt khi bạn cần kiểm tra so với '0' hoặc 0.
nicooo.

12

Sử dụng strlen()thay thế. Tôi đã chạy đến cùng một vấn đề bằng cách sử dụng các giá trị 1/0 cho một số biến. Tôi đang sử dụng if (strlen($_POST['myValue']) == 0)để kiểm tra xem có một ký tự hay không trong biến của tôi.


chỉ cần thêm @strlen để bỏ qua nhật ký lỗi, chỉ trong trường hợp ... để không tạo nhật ký lớn
Miguel

Tại sao bạn sẽ đặt @strlen. Miễn là bạn vượt qua một biến, nó sẽ không xuất ra lỗi. Nếu strlen của bạn trống, nó sẽ ghi lại giá trị là 0.
sketchthat

2
Nếu biến không được đặt, tôi tin rằng bạn sẽ gặp lỗi.
Evren Yurtesen

11

Gần đây tôi cũng bị bắt gặp với chiếc quần này. Vấn đề chúng ta thường giải quyết là các biến không đặt - nói một phần tử biểu mẫu có thể có hoặc không có ở đó, nhưng đối với nhiều phần tử, 0(hoặc chuỗi '0'sẽ đi qua bài chính xác hơn, nhưng vẫn được đánh giá là "falsey" ) là một giá trị hợp pháp nói trên một danh sách thả xuống.

sử dụng empty()đầu tiên và sau đó strlen()là tốt nhất của bạn nếu bạn cũng cần điều này, như:

if(!empty($var) && strlen($var)){
    echo '"$var" is present and has a non-falsey value!';
}

6

Từ quan điểm ngôn ngữ trống rỗng có một ý nghĩa không có giá trị . Giống như những người khác nói bạn sẽ phải sử dụng isset()để kiểm tra xem một biến đã được xác định chưa, đó là những gì bạn làm.


1
Câu trả lời đơn giản này đã giúp tôi làm sáng tỏ một vấn đề 0so với nullvấn đề một cách dễ dàng. Cảm ơn!
Giacomo1968

4

empty()trả về đúng cho mọi thứ được đánh giá FALSE, nó thực sự là một 'không' ( !) được ngụy trang. Tôi nghĩ bạn có nghĩa làisset()


4

Chấp nhận 0 làm giá trị sử dụng biến isset

Kiểm tra xem biến có trống không

$var = 0;

if ($var == '') {
    echo "empty";
} else {
    echo "not empty"; 
}
//output is empty

Kiểm tra nếu biến được đặt

$var = 0;

if (isset($var)) {
    echo "not empty";
} else {    
    echo "empty";
}
//output is not empty

4

Nó làm việc cho tôi!

//
if(isset($_POST['post_var'])&&$_POST['post_var']!==''){
echo $_POST['post_var'];
}

//results:
1 if $_POST['post_var']='1'
0 if $_POST['post_var']='0'
skip if $_POST['post_var']=''

1

Những điều sau đây được coi là trống rỗng:

  • "" (một chuỗi trống)
  • 0 (0 dưới dạng số nguyên)
  • "0" (0 dưới dạng chuỗi)
  • VÔ GIÁ TRỊ
  • SAI
  • mảng () (một mảng trống)
  • var $ var; (một biến được khai báo, nhưng không có giá trị trong một lớp)

Từ hướng dẫn sử dụng PHP

Trong trường hợp của bạn $var0như vậy, empty($var)sẽ trả về true, bạn đang phủ định kết quả trước khi kiểm tra nó, vì vậy khối khác sẽ chạy cho " Its empty" làm đầu ra.


1

Từ thủ công: Trả về FALSE nếu var có giá trị không trống và khác không.

Những điều sau đây được coi là trống rỗng:

  • "" (một chuỗi trống)
  • 0 (0 dưới dạng số nguyên)
  • "0" (0 dưới dạng chuỗi) NULL
  • FALSE mảng () (một mảng trống) var
  • $ var; (một biến được khai báo, nhưng không có giá trị trong một lớp)

Thêm: http://php.net/manual/en/feft.empty.php


1
if (empty($var) && $pieces[$var] != '0') {
//do something
}

Trong trường hợp của tôi mã này đã làm việc.


0

Trên thực tế, chỉ cần kiểm tra xem biến có đặt hay không. Trong trường hợp này nếu bạn muốn kiểm tra xem biến của bạn có thực sự bằng 0 hay không, bạn có thể sử dụng ví dụ này:

$myVar = '';
if (empty($myVar))
{
  echo "Its empty";
}
echo "<br/>";

if ($myVar===0)
{
  echo "also zero!";
}

chỉ cần thông báo $ myVar == 0 hoạt động như hàm rỗng.


0

trống rỗng có nghĩa là trống rỗng .. bất cứ điều gì lừa dối nói.

Khi tôi làm

$var = '';    
$var = '0';

tôi mong đợi rằng var_dump(empty($var)); sẽ trở lại sai.

nếu bạn đang kiểm tra mọi thứ trong một mảng, bạn luôn phải làm isset($var)trước.


0

chỉ sử dụng ($_POST['input_field_name'])!=0thay vì !($_POST['input_field_name'])==0sau đó 0 không được coi là trống.


0

Không chắc chắn nếu vẫn có người tìm kiếm một lời giải thích và một giải pháp. Các ý kiến ​​trên nói lên tất cả về sự khác biệt giữa TRUE / FALSE / 1 / 0.
Tôi chỉ muốn mang 2 xu của mình để hiển thị giá trị thực.

BOOLESE

Nếu bạn đang làm việc với kiểu dữ liệu Boolean, bạn đang tìm kiếm kết quả TRUE so với FALSE; nếu bạn lưu trữ nó trong MySQL, nó sẽ được lưu trữ dưới dạng 1 resp. 0 (nếu tôi không nhầm, điều này cũng tương tự trong bộ nhớ máy chủ của bạn).

Vì vậy, để hiển thị giá trị trong PHP, bạn cần kiểm tra xem nó đúng (1) hay sai (0) và hiển thị bất cứ thứ gì bạn muốn: "TRUE" hoặc "FALSE" hoặc có thể là "1" hoặc "0".
Chú ý, mọi thứ lớn hơn (hoặc khác) hơn 0 cũng sẽ được coi là TRUE trong PHP. Ví dụ: 2, "abc", v.v ... tất cả sẽ trả về ĐÚNG.

BIT, TINYINT

Nếu bạn đang làm việc với một kiểu dữ liệu số, cách nó được lưu trữ là như nhau.
Để hiển thị giá trị, bạn cần nói với PHP để xử lý nó dưới dạng số. Cách dễ nhất tôi tìm thấy là nhân nó với 1.


0

ví dụ thích hợp. chỉ cần tạo trường kiểu int (ví dụ số điện thoại di động) trong cơ sở dữ liệu và gửi một giá trị trống cho cơ sở dữ liệu sau thông qua một biểu mẫu hoặc chỉ cần chèn bằng SQL. những gì nó sẽ được lưu trong cơ sở dữ liệu 0 vì nó là kiểu int và không thể lưu dưới dạng trống hoặc null. do đó, nó trống nhưng nó sẽ được lưu dưới dạng 0. vì vậy khi bạn tìm nạp dữ liệu qua PHP và kiểm tra các giá trị trống. nó rất hữu ích và hợp lý

0,00, 0,000, 0,0000 .... 0,0 ... 0 cũng trống và ví dụ trên cũng có thể được sử dụng để lưu trữ các loại giá trị khác nhau trong cơ sở dữ liệu như float, double, binary (thập phân có các biến thể khác nhau như 0.000, v.v.


0

Bạn cần sử dụng isset () để kiểm tra xem giá trị đã được đặt chưa.


Xin chào @Veershetty, chào mừng bạn đến với Stack Overflow. Cảm ơn bạn đã trả lời tuy nhiên dường như không thêm bất cứ điều gì mới vào các câu trả lời hiện có, chi tiết hơn. Chỉnh sửa câu trả lời để thêm chi tiết bị thiếu trong các câu trả lời khác hoặc xem xét xóa câu trả lời của bạn nếu nó không có gì mới.
Gricey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.