PHP中的空值问题

在PHP中”“, 0, “0”, NULL, FALSE, array(), var $var,以及没有任何属性的对象都将被认为是空的。但要注意array(array())不是空的。

一、在工作当中出现一个这样的问题


$data['result']['customer']['pros'] = array();
<!-- lang: php -->
if(!empty($customer_products)){
<!-- lang: php -->
    foreach($customer_products as $product){
<!-- lang: php -->
        $customer_products_temp = array();
<!-- lang: php -->
        $customer_products_temp['productid'] = $product['productid'];
<!-- lang: php -->
        $customer_products_temp['productname'] = $product['productname'];
<!-- lang: php -->
        $customer_products_temp['authorname'] = $product['authorname'];
<!-- lang: php -->
        array_push($data['result']['customer']['pros'],$customer_products_temp);
<!-- lang: php -->
    }
<!-- lang: php -->
}

当$myarrs 的值对应 array(array())时会报错如不存在productid等字段,当时疑惑前面已经判断$customer_products不是空的了怎么会出现这个问题呢,后来发现$customer_products时二维数组当$customer_products === array(array())时它的值不为空,但此时foreach中的$product是空值,根本就不存在$product['productid']等。

上面代码应该修改为


$data['result']['customer']['pros'] = array();
<!-- lang: php -->
if(!empty($customer_products)){
<!-- lang: php -->
    foreach($customer_products as $product){
<!-- lang: php -->
        if(!empty($product)){
<!-- lang: php -->
            $customer_products_temp = array();
<!-- lang: php -->
            $customer_products_temp['productid'] = $product['productid'];
<!-- lang: php -->
            $customer_products_temp['productname'] = $product['productname'];
<!-- lang: php -->
            $customer_products_temp['authorname'] = $product['authorname'];
<!-- lang: php -->
            array_push($data['result']['customer']['pros'],$customer_products_temp);
<!-- lang: php -->
        }
<!-- lang: php -->
     }
<!-- lang: php -->
}

二、关于0,null,false,'','0','null'的值是否相等的问题


echo "0 and null is:";
<!-- lang: php -->
echo 0 == null ? 'equal' : 'unequal';
<!-- lang: php -->
echo '<br>';    //输出:0 and null is:equal
<!-- lang: php -->

<!-- lang: php -->
echo "0 and 'null' is:";
<!-- lang: php -->
echo 0 == null ? 'equal' : 'unequal';
<!-- lang: php -->
echo '<br>';    //输出:0 and 'null' is:equal
<!-- lang: php -->

<!-- lang: php -->
echo "null and 'null' is:";
<!-- lang: php -->
echo null == 'null' ? 'equal' : 'unqual';
<!-- lang: php -->
echo '<br>';    //输出:null and 'null' is:unqual

起初对于第三个结果有个疑惑,这相当于:甲 == 已 ,甲 == 丙,但是 已 != 丙。看了PHP的自动类型转换后明白了。“null"是不带数字的字符串在 0 == “null"计算自动转换为整型0,但是自动转换并没有改变"null"的类型。

三、自动类型转换

在PHP中,自动转换通常发生在不同数据类型的变量进行混合运算是。若参与运算量的数据类型不同,则先转换成同一类型,然后再进行运算。通常只有4种标量类型(integer, float, string, boolean)才使用自动类型转换。注意,这并没有改变这些运算数本身的类型,改变的仅是这些运算数如何被求值。自动类型转换虽然是由系统自动完成的,但在混合运算时,自动转换要遵循转换按数据长度增加的方向进行,以保持精度不被降低。

有布尔型参与运算时,TRUE将转化为整型1,FALSE将转化为整型0后再参与运算

有NULL值参与运算时,NULL值转化为整型0再进行运算。

有integer型和float型参与运算时,先把integer型变量转成float类型后再进行计算

有字符串和数字型(integer,float)数据参与运算时,字符串先准换为数字,再参与运算,字符串先转换为数字,再参与运算。转化后的数字是从字符串开始的数值型字符串,如果字符串开始的数值型字符串不带小数点则转为integer类型数字。如果带有小数点,则转为float类型的数字,例如,字符串"123abc"转为整数123,字符串"123.454abc"转为浮点数123.454,字符串"abc"转为整数0

你可能感兴趣的:(PHP中的空值问题)