在PHP中"", 0, "0", NULL, FALSE, array(), var $var,以及没有任何属性的对象都将被认为是空的。但要注意array(array())不是空的。
一、在工作当中出现一个这样的问题
$data['result']['customer']['pros'] = array(); if(!empty($customer_products)){ foreach($customer_products as $product){ $customer_products_temp = array(); $customer_products_temp['productid'] = $product['productid']; $customer_products_temp['productname'] = $product['productname']; $customer_products_temp['authorname'] = $product['authorname']; array_push($data['result']['customer']['pros'],$customer_products_temp); } }
但当$myarrs 的值对应 array(array())时会报错如不存在productid等字段,当时疑惑前面已经判断$customer_products不是空的了怎么会出现这个问题呢,后来发现$customer_products时二维数组当$customer_products === array(array())时它的值不为空,但此时foreach中的$product是空值,根本就不存在$product['productid']等。
上面代码应该修改为
$data['result']['customer']['pros'] = array(); if(!empty($customer_products)){ foreach($customer_products as $product){ if(!empty($product)){ $customer_products_temp = array(); $customer_products_temp['productid'] = $product['productid']; $customer_products_temp['productname'] = $product['productname']; $customer_products_temp['authorname'] = $product['authorname']; array_push($data['result']['customer']['pros'],$customer_products_temp); } } }
二、关于0,null,false,'','0','null'的值是否相等的问题
echo "0 and null is:"; echo 0 == null ? 'equal' : 'unequal'; echo ''; //输出:0 and null is:equal echo "0 and 'null' is:"; echo 0 == null ? 'equal' : 'unequal'; echo ''; //输出:0 and 'null' is:equal echo "null and 'null' is:"; echo null == 'null' ? 'equal' : 'unqual'; echo ''; //输出: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