PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

floatval> <doubleval
Last updated: Fri, 10 Oct 2008

view this page in

empty

(PHP 4, PHP 5)

emptyDetermine whether a variable is empty

Description

bool empty ( mixed $var )

Determine whether a variable is considered to be empty.

Parameters

var

Variable to be checked

Note: empty() only checks variables as anything else will result in a parse error. In other words, the following will not work: empty(trim($name)).

empty() is the opposite of (boolean) var, except that no warning is generated when the variable is not set.

Return Values

Returns FALSE if var has a non-empty and non-zero value.

The following things are considered to be empty:

  • "" (an empty string)
  • 0 (0 as an integer)
  • "0" (0 as a string)
  • NULL
  • FALSE
  • array() (an empty array)
  • var $var; (a variable declared, but without a value in a class)

ChangeLog

Version Description
PHP 5

As of PHP 5, objects with no properties are no longer considered empty.

PHP 4

As of PHP 4, The string value "0" is considered empty.

Examples

Example #1 A simple empty() / isset() comparison.

<?php
$var 
0;

// Evaluates to true because $var is empty
if (empty($var)) {
    echo 
'$var is either 0, empty, or not set at all';
}

// Evaluates as true because $var is set
if (isset($var)) {
    echo 
'$var is set even though it is empty';
}
?>

Notes

Note: Because this is a language construct and not a function, it cannot be called using variable functions



floatval> <doubleval
Last updated: Fri, 10 Oct 2008
 
add a note add a note User Contributed Notes
empty
Anonymous
26-Aug-2008 09:11
to john_jian,

for the loose equal operator(==), if both operands are not of the same data type, one of the operand will be converted to have the same data type as the other,

'' == 0 is true because '' is casted to integer 0,
0 == '0'  is true because '0' is casted to integer 0,
'' == '0' is false because '' string is not equal to '0' string
justin at booleangate dot org
23-Aug-2008 12:09
@john_jian, et al

PHP does have explicit type casting.

Also consider that, due to the implicit casting that Anonymous pointed out, "-" == (int)"-" and "+" == (int)"-" both evaluate as bool(true).

var_dump("-" == (int)"-");
var_dump("+" == (int)"-");

This is small hiccup that I ran into a few weeks back when validating some user input.  I thought it was a bug at first, but it's not, it's just one of those gotchas that crop up sometimes when dealing with a typeless language.

It would be preferable, however, if PHP could raise an E_NOTICE when it encounters a cast that results in a default value such as in the above case.
justin at booleangate dot org
22-Aug-2008 11:59
How about this improvement to Karl Jung's my_empty

function my_empty($val) {
    $val = trim($val);
  
    return empty($val) && $val !== 0;
}
Anonymous
20-Aug-2008 09:41
To add on to what anon said, what's happening in john_jian's example seems unusual because we don't see the implicit typecasting going on behind the scenes.  What's really happening is:

$a = '';
$b = 0;
$c = '0';

(int)$a == $b -> true, because any string that's not a number gets converted to 0
$b==(int)$c -> true, because the int in the string gets converted
and
$a==$c -> false, because they're being compared as strings, rather than integers.  (int)$a==(int)$c should return true, however.

Note: I don't remember if PHP even *has* typecasting, much less if this is the correct syntax.  I'm just using something for the sake of examples.
Anonymous
10-Jul-2008 01:50
@ john_jian

responding to: 0 == '0' ==> true

no wonder: php performs an implicit (int) to '0' if one of the compared parameters is found to be type number.

So 0 == '0' is the same as 0 == (int)'0' and results to true. Using 0==='0' will get the "right" result with strict comparison.
john_jian at 163 dot com
27-Jun-2008 03:09
I found that:
$a = '';
$b = 0;
$c = '0';

$a == $b, and $b == $c, but $c != $a
tom at tomwardrop dot com
22-May-2008 12:01
In reply to "admin at ninthcircuit dot info",

Using str_replace is unnecessary. I would encourage the use of trim which would most likely be faster (haven't tested) and easier. Trim also takes care of other white space like line breaks and tabs. Actually, in most of the applications I code, I use a multi-dimensional array map function with trim on the Super Globals such as $_POST, $_GET and $_COOKIE as so far, there hasn't been an instance where I would want any user input to begin or end with whitespace. The good thing about doing this is that you never have to worry about 'trimming' your input which makes your code easier and more reliable (incase you forget to trim some input).
Greg Hartwig
02-May-2008 09:55
David from CodeXplorer:
>> The ONLY reason to use empty() is for code readability. It is the same as an IF/ELSE check.
>> So, don't bother using EMPTY in the real world.

This is NOT true.  empty() will not generate warnings if you're testing against an undefined variable as a simple boolean check will.  On production systems, warnings are usually shut off, but they are often active on development systems.

You could test a flag with
   <?php if ($flagvar)  ... ?>
but this can generate a warning if $flagvar is not set.

Instead of
   <?php if (isset($flagvar) && $flagvar)  ... ?>
you can simply use
   <?php if (!empty($flagvar))  ... ?>

for easy readability without warnings.
David from CodeXplorer
11-Mar-2008 04:29
Mad Hampster did  his test wrong. empty is NOT faster than a simple boolean check. The ONLY reason to use empty() is for code readability. It is the same as an IF/ELSE check. But if you are dealing with intermediate or higher level coders this function has no other benefit.

So, don't bother using EMPTY in the real world.

I ran an array with 5000 simple true/false values through four checks (both types twice) in case of any gain one type might have by going first. These are my results generated one one page request. (PHP5)

0.015328 Time EMPTY
0.014281 Time IF/ELSE
0.015239 Time EMPTY
0.013404 Time IF/ELSE

The page was accessed a couple times to reduce caching effects.
Andrea Giammarchi
31-Jan-2008 03:34
In addiction to Ed comment:
http://uk.php.net/manual/en/function.empty.php#80106

if an instance variable is assigned with an empty value, i.e. false, empty returns true.

<?php
class TestEmpty{
    protected          
$empty;
    public  function   
__construct(){
       
var_dump(empty($this->empty)); // true
       
$this->empty = false;
       
var_dump(empty($this->empty)); // true
   
}
}
new
TestEmpty;
?>

I think this is an expected behaviour but at the same time the note about classes variables is too ambiguous.

''var $var; (a variable declared, but without a value in a class)''

Please change them into something like:
''var $var; (a variable undeclared or declared with an empty value in a class)''
jay at w3prodigy dot com
28-Jan-2008 06:59
Also note, that if you have a URI that looks like this:

/page/index.php?query=

performing isset($_GET['query']) will return TRUE. as query is set, though null, in the QUERY.

To counteract this behavior, check isset($_GET['query']) and !empty($_GET['query']) as empty will detect the null value.
Ed
29-Dec-2007 08:08
Also, it doesn't appear to mention in the documentation, if a variable hasn't previously been declared, empty also returns true.

E.g.
var $bar;
empty( $bar ); // declared variable returns true.
empty( $foo ); // undeclared variable also returns true.

The closest the documentation comes to saying this is:
"var $var; (a variable declared, but without a value in a class)"
which isn't really the same, as the variable doesn't necessarily have to be declared first.
MaD HamsteR
12-Dec-2007 03:33
SAME RESULT! But somehow using empty() function is faster for about 10-13%

<?php

$array
[] = "";
$array[] = '';
$array[] = 0;
$array[] = "0";
$array[] = NULL;
$array[] = false;
$array[] = array();
$array[] = $var;

foreach(
$array as $value){
    echo (!empty(
$value))? 'Not empty!' : 'Empty!';
    echo
'<br />'."\r\n";
}

echo
'<br />'."\r\n";

foreach(
$array as $value){
    echo (
$value)? 'Not empty!' : 'Empty!';
    echo
'<br />'."\r\n";
}

?>
EllisGL
04-Oct-2007 09:48
Here's what I do for the zero issue issue:
if($val == '' && $val !== 0 && $val !== '0')
Antone Roundy
15-Sep-2007 01:55
There's a faster and easier to write method than (isset($a) && strlen($a)) -- isset($a{0}). It evaluates to false if $a is not set or if it has zero length (ie. it's first character is not set). My tests indicate that it's about 33% faster.
rkulla2 at gmail dot com
05-Sep-2007 10:57
Since I didn't like how empty() considers 0 and "0" to be empty (which can easily lead to bugs in your code), and since it doesn't deal with whitespace, i created the following function:

<?php
function check_not_empty($s, $include_whitespace = false)
{
    if (
$include_whitespace) {
       
// make it so strings containing white space are treated as empty too
       
$s = trim($s);
    }
    return (isset(
$s) && strlen($s)); // var is set and not an empty string ''
}
?>

Instead of saying if (!empty($var)) { // it's not empty } you can just say if (check_not_empty($var)) { // it's not empty }.

If you want strings that only contain whitespace (such as tabs or spaces) to be treated as empty then do: check_not_empty($var, 1)

If you want to check if a string IS empty then do: !check_not_empty($var).

So, whenever you want to check if a form field both exists and contains a value just do: if (check_not_empty($_POST['foo'], 1))

no need to do if (isset() && !empty()) anymore =]
Talus (talusch dot no dot spam at gmail dot com)
26-Jul-2007 11:30
Hello,

I made something better than fnbh at freemail dot hu in order to put more variables as an arg into the empty function (like isset, you can put every var you want to, if one is not set, then it returns false : the behaviour of this function will do the same, except that if one of the variables if empty, then it returns true). But, I made it the simpliest way, and also i'm usign the foreach structure, which is, i believe so, is better than the for structure for an array.

Here it comes :

<?php
function multi_empty(){
   
// -- If no parameters, then it is empty (just a matter of logic, nah ?).
   
if( func_num_args() == 0 ){
        return
true;
    }
   
   
$args = func_get_args();
   
   
// -- Getting through all the arguments. If there's one which is empty, then we return true : there is no reason to continue... ;)
   
foreach($args as $arg){
        if( empty(
$arg) ){
            return
true;
        }
    }
   
   
// -- Nothing was found empty ; then the result is false.
   
return false;
}
?>
florian.sonner [at] t-online.de
11-Jun-2007 07:06
Since a few people here mentioned that empty will not work with magic-overloading ("__get($var)"):

empty(..) goes the same way as isset(..) do, to check if a property exists. Thus you have to override the magic-function __isset($var) to produce correct results for empty(..) in combination with a magic-overloaded property.
M
24-Mar-2007 01:32
The empty() function is not exactly useful.... it defines both "0" and 0 (the numerical version) as empty. That's not really true is it!

Consider a user updating a record and setting a value to 0. When the form is posted and empty() is used to check for empty values it will return true. If you are testing for a mandatory field this will fail... even though the field has a value.

The following checks if a field is "really" empty, and includes as many test cases as I could think of.

<?php
function isempty($var) {
    if (((
is_null($var) || rtrim($var) == "") && $var !== false) || (is_array($var) && empty($var))) {
        echo
"yes<br />";
    } else {
        echo
"no<br />";
    }
}

echo
"1. unset variable - yes - ";
isempty($unset);

echo
"2. empty string - yes - ";
$var = "";
isempty($var);

echo
"3. zero string - no - ";
$var = "0";
isempty($var);

echo
"4. zero number - no - ";
$var = 0;
isempty($var);

echo
"5. null string - yes - ";
$var = null;
isempty($var);

echo
"6. single space - yes - ";
$var = " ";
isempty($var);

echo
"7. several space - yes - ";
$var = "    ";
isempty($var);

echo
"8. true - no - ";
$var = true;
isempty($var);

echo
"9. false - no - ";
$var = false;
isempty($var);

echo
"10. empty array - yes - ";
$var = array();
isempty($var);
?>

The output from this should be...

1. unset variable - yes - yes
2. empty string - yes - yes
3. zero string - no - no
4. zero number - no - no
5. null string - yes - yes
6. single space - yes - yes
7. several space - yes - yes
8. true - no - no
9. false - no - no
10. empty array - yes - yes

Regards,
M
15-Mar-2007 10:02
Speed comparisons between empty($foo) versus !$foo are pointless; you're saving what, a couple dozen nanoseconds? If you care that much you'll have to benchmark every single new version of PHP in case changes affect the relative speeds of your various methods, and then recode if one method overtakes another. Now THAT is a waste of time.

Far more important is that your code says what you want it to mean.

Besides, when $foo is not set empty($foo) is >1400% faster than !$foo (and that's AFTER suppressing the notice message).
Karl Jung
03-Jun-2006 04:03
This function I did, works like empty(), but doesn't consider zero (0) as empty.
Also, considers as empty, a string containing only blank spaces, or "\n", "\t", etc.

function my_empty($val)
{
    $result = false;
   
    if (empty($val))
        $result = true;

    if (!$result && (trim($val) == ""))
        $result = true;

    if ($result && is_numeric($val) && $val == 0)
        $result = false;

    return $result;
}

Values considered as EMPTY:

$val = "";
$val = "  ";
$val = " \t \n ";
$val = array();
$val = false;
$val = null;

Values considered NOT EMPTY:

$val = "0";
$val = intval(0);
$val = floatval(0);
nobody at example dot com
28-Feb-2006 08:06
Re: inerte is my gmail.com username's comment:

While that may be true, those two statements (empty($var), $var == '') are NOT the same. When programming for web interfaces, where a user may be submitting '0' as a valid field value, you should not be using empty().

<?php
    $str
= '0';

   
// outputs 'empty'
   
echo empty($str) ? 'empty' : 'not empty';

   
// outputs 'not empty'
   
echo $str == '' ? 'empty' : 'not empty';
?>
nahpeps at gmx dot de
19-Aug-2005 10:14
When using empty() on an object variable that is provided by the __get function, empty() will always return true.

For example:
class foo {
  
   public function __get($var) {
      if ($var == "bar") {
         return "bar";  
      }  
   }  
}
$object_foo = new foo();
echo '$object_foo->bar is ' . $object_foo->bar;
if (empty($object_foo->bar)) {
   echo '$object_foo->bar seems to be empty';  
}

produces the following output:
$object_foo->bar is bar
$object_foo->bar seems to be empty
jmarbas at hotmail dot com
01-Jul-2005 04:10
empty($var) will return TRUE if $var is empty (according to the definition of 'empty' above) AND if $var is not set.

I know that the statement in the "Return Values" section of the manual already says this in reverse:

"Returns FALSE if var has a non-empty and non-zero value."

but I was like "Why is this thing returning TRUE for unset variables???"... oh i see now... Its supposed to return TRUE for unset variables!!!

<?php
  ini_set
('error_reporting',E_ALL);
 
ini_set('display_errors','1');
  empty(
$var);
?>
admin at ninthcircuit dot info
24-May-2005 05:14
Something to note when using empty():

empty() does not see a string variable with nothing but spaces in it as "empty" per se.

Why is this relevant in a PHP application? The answer is.. if you intend to use empty() as a means of input validation, then a little extra work is necessary to make sure that empty() evaluates input with a more favorable outcome.

Example:
<?php
  $spaces
= "       ";
 
/* This will return false! */
 
if (empty($spaces))
     print
"This will never be true!";
  else
     print
"Told you!";
?>

To make empty() behave the way you would expect it to, use str_replace().

<?php
  $spaces
= str_replace(" ","","      ");
 
/* This will return true! */
 
if (empty($spaces))
      print
"This will always be true!";
  else
      print
"Told you!";
?>

This might seem trivial given the examples shown above; however, if one were to be storing this information in a mySQL database (or your preferred DB of choice), it might prove to be problematic for retrieval of it later on.
paul at worldwithoutwalls dot co dot uk
22-May-2004 05:09
Note the exceptions when it comes to decimal numbers:

<?php
$a
= 0.00;
$b = '0.00';
echo (empty(
$a)? "empty": "not empty"); //result empty
echo (empty($b)? "empty": "not empty"); //result not empty
//BUT...
$c = intval($b);
echo (empty(
$c)? "empty": "not empty"); //result empty
?>

For those of you using MySQL, if you have a table with a column of decimal type, when you do a SELECT, your data will be returned as a string, so you'll need to do apply intval() before testing for empty.

e.g.
TABLE t has columns id MEDIUMINT and d DECIMAL(4,2)
and contains 1 row where id=1, d=0.00
<?php
$q
= "SELECT * FROM t";
$res = mysql_query($q);
$row = mysql_fetch_assoc($res);
echo (empty(
$row['d'])? "empty": "not empty"); //result not empty
?>

floatval> <doubleval
Last updated: Fri, 10 Oct 2008
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites