ใน php, 0 จะถือว่าว่างเปล่า?


144

รหัสจะอธิบายเพิ่มเติม:

$var = 0;

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

ผลลัพธ์จะส่งกลับ "มันว่างเปล่า" ฉันคิดว่า empty () จะตรวจสอบว่าฉันได้ตั้งค่าตัวแปรแล้วและมีค่าอยู่ภายในหรือไม่ ทำไมมันกลับมา "ว่างเปล่า" ??


15
@stereo emptyอาจเป็นฟังก์ชัน PHP ที่มีประโยชน์ แต่เข้าใจผิดกันอย่างกว้างขวาง เรียนรู้วิธีและเวลาที่จะใช้
หลอกลวง

2
@stereo emptyนั้นสั้นisset($var) && $var != falseมาก คุณต้องถือemptyสิ่งแปลก ๆของคุณเพื่อยิงตัวเองด้วยเท้า ; P
หลอกลวง

@stereo 1) มัน "ไม่สอดคล้อง" ที่ไหน? มันใช้งานได้เหมือนที่เขียนไว้บนกระป๋อง 2) การเปรียบเทียบตัวแปรกับfalseโดยไม่ต้องเรียกข้อผิดพลาด "ตัวแปรที่ไม่ได้กำหนด" อย่างอิสระนั้นไร้ประโยชน์หรือไม่? อืมสมมุติว่าคุณไม่เคยทำแบบนี้ ... 3) การเลือกฟังก์ชั่นที่ผิดในบริบทความปลอดภัยไม่ได้หมายความว่าฟังก์ชั่นนั้นไม่ดีไร้ประโยชน์หรือไม่สอดคล้องกัน มันหมายความว่ามีคนเลือกฟังก์ชั่นที่ผิดสำหรับงาน
หลอกลวง


18
@deceze - หากฟังก์ชั่นนั้นมีความเข้าใจผิดอย่างกว้างขวางเช่นempty()นั้นมันอาจมีชื่อผิด
martinstoeckli

คำตอบ:


189

http://php.net/empty

สิ่งต่อไปนี้จะถือว่าว่างเปล่า:

  • "" (สตริงว่าง)
  • 0 (0 เป็นจำนวนเต็ม)
  • 0.0 (0 เป็นแบบลอย)
  • "0" (0 เป็นสตริง)
  • โมฆะ
  • FALSE
  • array () (อาร์เรย์ว่าง)
  • var $ var; (ตัวแปรที่ประกาศ แต่ไม่มีค่าในคลาส)

falseโปรดทราบว่าตรงนี้เป็นรายการเช่นเดียวกับการข่มขู่การบูลีน เป็นเพียงempty !isset($var) || !$varลองissetแทน


ดังนั้นฉันต้องตรวจสอบดังนี้: ถ้า (isset ($ var) && $ $! = 0) {Do Something} ??
mysqllearner

1
@mysql สำหรับกรณีนี้คุณอาจใช้เช่นกัน!empty($var)แต่โปรดทราบว่านั่นไม่เหมือนกับที่คุณเขียนไว้ในคำถาม สิ่งที่ใช้ขึ้นอยู่กับว่าคุณต้องการคำนึงถึงคุณค่าtrueใด เพียงเปรียบเทียบความแตกต่างระหว่างissetและemptyและเลือกชุดค่าผสมที่เหมาะสมสำหรับสถานการณ์ที่เหมาะสม
หลอกลวง

7
@mysqllearner: issetผลตอบแทนถ้าTrue $var=0แต่สิ่งที่คุณหมายถึงif(isset($var) && $var != 0)คือempty
Felix Kling

@mysqllearner isset ตรวจพบว่าไม่ว่างเปล่า เพื่อตรวจสอบว่าว่างเปล่าหรือไม่ให้ใช้! isset แทน

1
@Deji ตั้งแต่ PHP มีรากของมันเป็นภาษาเว็บและค่าในการร้องขอ HTTP สตริงเสมอจะถูกถือว่าเป็นเทียบเท่ากับ'0' 0นั่นคือปรัชญาการออกแบบหลักของ PHP ฉันยอมรับว่านี่เป็นตัวเลือกที่ถกเถียงกันมากแต่ฉันไม่ได้มาที่นี่เพื่ออภิปรายทางเลือกนั้นกับคุณ ภายในตรรกะของ PHP, emptyเทียบเท่ากับ== falseลบเครื่องหมายเป็น IMO ที่ดี บางสิ่งที่ควรจะแตกต่างกันมากใน PHP กว่าพวกเขาเป็นหัวข้อที่แตกต่างกัน
หลอกลวง

76

ผมก็สงสัยว่าทำไมไม่มีใครแนะนำที่มีประโยชน์มากตารางเปรียบเทียบประเภท มันตอบคำถามทุกข้อเกี่ยวกับฟังก์ชั่นทั่วไปและเปรียบเทียบผู้ประกอบการ

ตัวอย่าง:

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   

นอกจาก cheatsheets อื่น ๆ ฉันจะเก็บสำเนาของตารางนี้ไว้บนโต๊ะของฉันเสมอในกรณีที่ฉันไม่แน่ใจ


2
คุณควรอัปเดตสูตรโกงตอนนี้ฉันจะให้คุณมากกว่านี้ ... 0.0 = จริง, 0.00 = จริง, "0.0" = เท็จ
Sayed Mohd Ali

34

ในกรณีของค่าตัวเลขคุณควรใช้ฟังก์ชัน is_numeric:

$var = 0;

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

1
วิธีแก้ปัญหาที่ดีเมื่อคุณต้องการตรวจสอบกับ '0' หรือ 0.
nicooo

12

ใช้strlen()แทน ฉันพบปัญหาเดียวกันโดยใช้ค่า 1/0 สำหรับตัวแปรบางตัว ฉันใช้if (strlen($_POST['myValue']) == 0)เพื่อทดสอบว่ามีตัวละครหรือไม่ในตัวแปรของฉัน


เพียงแค่เพิ่ม @strlen ที่จะละเว้นบันทึกข้อผิดพลาดเพียงในกรณีที่ ... ที่จะไม่สร้างบันทึกขนาดใหญ่
มิเกล

@strlenทำไมคุณจะใส่ ตราบใดที่คุณผ่านตัวแปรมันก็ไม่ควรที่จะแสดงข้อผิดพลาด ถ้าคอของคุณว่างเปล่ามันจะบันทึกค่าเป็น 0
ร่างที่

2
หากตัวแปรไม่ได้ตั้งค่าฉันเชื่อว่าคุณจะได้รับข้อผิดพลาด
Evren Yurtesen

11

ฉันเพิ่งจับกางเกงของฉันลงบนอันนี้เช่นกัน ปัญหาที่เราจัดการบ่อยครั้งคือตัวแปรที่ไม่มีการตั้งค่า - พูดว่าองค์ประกอบของแบบฟอร์มที่อาจหรืออาจไม่เคยมีมาก่อน แต่สำหรับองค์ประกอบหลาย ๆ อย่าง0(หรือสตริง'0'ที่จะผ่านการโพสต์ได้อย่างแม่นยำมากขึ้น ) เป็นค่าที่ถูกต้องว่าในรายการแบบเลื่อนลง

ใช้empty()ครั้งแรกแล้วstrlen()ดีที่สุดของคุณถ้าคุณต้องการเช่นกันเช่น:

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

6

จากมุมมองของภาษาที่ว่างเปล่ามีความหมายของโดยไม่คุ้มค่า เช่นเดียวกับที่คนอื่นพูดว่าคุณจะต้องใช้isset()เพื่อตรวจสอบว่ามีการกำหนดตัวแปรซึ่งเป็นสิ่งที่คุณทำ


1
คำตอบง่ายๆนี้ช่วยฉันแก้ปัญหา0เมื่อเทียบnullกับอย่างง่ายดาย ขอบคุณ!
Giacomo1968

4

empty()ส่งกลับค่าจริงสำหรับทุกสิ่งที่ประเมินFALSEว่าจริง ๆ แล้วเป็น 'ไม่' ( !) ในการปลอมตัว ฉันคิดว่าคุณหมายถึงisset()


4

หากต้องการยอมรับ 0 เป็นค่าในการใช้งานตัวแปร isset

ตรวจสอบว่าตัวแปรว่างเปล่า

$var = 0;

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

ตรวจสอบว่ามีการตั้งค่าตัวแปร

$var = 0;

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


1

สิ่งต่อไปนี้จะถือว่าว่างเปล่า:

  • "" (สตริงว่าง)
  • 0 (0 เป็นจำนวนเต็ม)
  • "0" (0 เป็นสตริง)
  • โมฆะ
  • FALSE
  • array () (อาร์เรย์ว่าง)
  • var $ var; (ตัวแปรที่ประกาศ แต่ไม่มีค่าในคลาส)

จากคู่มือ PHP

ในกรณีของคุณ$varคือ0เพื่อempty($var)จะกลับมาtrueคุณจะกวนผลก่อนการทดสอบมันดังนั้นบล็อกอื่นจะทำงานให้ " Its empty" เป็นเอาท์พุท


1

จาก Manual: ส่งคืน FALSE หาก var มีค่าที่ไม่ว่างเปล่าและไม่เป็นศูนย์

สิ่งต่อไปนี้จะถือว่าว่างเปล่า:

  • "" (สตริงว่าง)
  • 0 (0 เป็นจำนวนเต็ม)
  • "0" (0 เป็นสตริง) NULL
  • อาร์เรย์ FALSE () (อาร์เรย์ว่าง) var
  • $ var; (ตัวแปรที่ประกาศ แต่ไม่มีค่าในคลาส)

เพิ่มเติมได้ที่: http://php.net/manual/th/function.empty.php



0

ผู้ออกจริงเพียงตรวจสอบว่าชุดตัวแปรหรือไม่ในกรณีนี้ถ้าคุณต้องการตรวจสอบว่าตัวแปรของคุณเป็นศูนย์หรือเปล่าคุณสามารถใช้ตัวอย่างนี้:

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

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

เพียงแจ้งให้ทราบล่วงหน้า $ myVar == 0 ทำหน้าที่เหมือนฟังก์ชันว่าง


0

ว่างเปล่าควรหมายถึงว่างเปล่า .. สิ่งที่หลอกลวงบอก

เมื่อฉันทำ

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

ฉันคาดว่ามันvar_dump(empty($var));จะกลับมาเป็นเท็จ

หากคุณกำลังตรวจสอบสิ่งต่าง ๆ ในอาร์เรย์คุณต้องทำisset($var)ก่อนเสมอ


0

ใช้เพียง($_POST['input_field_name'])!=0แทนที่จะ!($_POST['input_field_name'])==0เป็น 0 จะไม่ถือว่าว่างเปล่า


0

ไม่แน่ใจว่ายังมีคนมองหาคำอธิบายและวิธีแก้ปัญหาหรือไม่ ความคิดเห็นข้างต้นบอกว่าทั้งหมดเกี่ยวกับความแตกต่างระหว่าง TRUE / FALSE / 1/0
ฉันต้องการนำ 2 เซ็นต์ของฉันเพื่อแสดงค่าที่แท้จริง

บูลีน

หากคุณกำลังทำงานกับประเภทข้อมูลบูลีนคุณกำลังมองหาผลลัพธ์ที่เป็น TRUE vs. FALSE ถ้าคุณเก็บไว้ใน MySQL มันจะถูกเก็บไว้เป็น 1 resp 0 (ถ้าฉันไม่เข้าใจผิดนี่เป็นสิ่งเดียวกันในหน่วยความจำของเซิร์ฟเวอร์ของคุณ)

ดังนั้นเพื่อแสดงค่าใน PHP คุณต้องตรวจสอบว่ามันเป็นจริง (1) หรือเท็จ (0) และแสดงสิ่งที่คุณต้องการ: "TRUE" หรือ "FALSE" หรืออาจเป็น "1" หรือ "0"
ความสนใจทุกสิ่งที่ใหญ่กว่า (หรือแตกต่าง) กว่า 0 จะถูกพิจารณาว่าเป็น TRUE ใน PHP เช่น: 2, "abc" ฯลฯ จะส่งกลับค่า TRUE ทั้งหมด

BIT, TINYINT

หากคุณทำงานกับประเภทข้อมูลตัวเลขวิธีการจัดเก็บจะเหมือนกัน
ในการแสดงค่าคุณต้องแจ้งให้ PHP จัดการเป็นตัวเลข วิธีที่ง่ายที่สุดที่ฉันพบคือการคูณด้วย 1


0

ตัวอย่างที่เหมาะสม เพียงแค่สร้างฟิลด์ประเภท int (ตัวอย่างหมายเลขโทรศัพท์มือถือ) ในฐานข้อมูลและส่งค่าว่างสำหรับฐานข้อมูลต่อไปนี้ผ่านแบบฟอร์มหรือเพียงแค่แทรกโดยใช้ SQL สิ่งที่มันจะถูกบันทึกไว้ในฐานข้อมูล 0 เพราะมันเป็นประเภท int และไม่สามารถบันทึกเป็นช่องว่างหรือว่างเปล่า ดังนั้นมันว่างเปล่า แต่มันจะถูกบันทึกเป็น 0 ดังนั้นเมื่อคุณดึงข้อมูลผ่าน PHP และตรวจสอบค่าว่าง มันมีประโยชน์มากและถูกต้องตามหลักเหตุผล

0.00, 0.000, 0.0000 .... 0.0 ... 0 ยังว่างเปล่าและตัวอย่างข้างต้นยังสามารถใช้สำหรับการจัดเก็บค่าชนิดต่าง ๆ ในฐานข้อมูลเช่น float, double, ทศนิยม (ทศนิยมมีตัวแปรที่แตกต่างกันเช่น 0.000 เป็นต้นไป


0

คุณต้องใช้ isset () เพื่อตรวจสอบว่าได้ตั้งค่าไว้หรือไม่


สวัสดี @Veershetty ยินดีต้อนรับสู่ Stack Overflow ขอบคุณสำหรับคำตอบของคุณ แต่ดูเหมือนจะไม่ได้เพิ่มอะไรใหม่มากกว่าคำตอบที่มีอยู่และมีรายละเอียดมากขึ้น แก้ไขคำตอบเพื่อเพิ่มรายละเอียดที่หายไปจากคำตอบอื่น ๆ หรือพิจารณาลบคำตอบของคุณหากไม่มีคำตอบใหม่
Gricey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.