php将数值视为空字符串(奇怪的行为)
这是我自己的代码,混淆了2个多小时php将数值视为空字符串(奇怪的行为),php,variables,Php,Variables,这是我自己的代码,混淆了2个多小时 $int_length_1 = $data[0]['length_1']; // length_1 is mysql integer field print_result(array('difference' => $data[0]['length_1'], 'object' => 'line')); $int_length_2 = $data[0]['length_2']; // length_2 is mysql integer f
$int_length_1 = $data[0]['length_1']; // length_1 is mysql integer field
print_result(array('difference' => $data[0]['length_1'], 'object' => 'line'));
$int_length_2 = $data[0]['length_2']; // length_2 is mysql integer field
print_result(array('difference' => $int_length_2, 'object' => 'line'));
print_result(array('difference' => ($data[0]['length_1'] - $data[0]['length_2']), 'object' => 'line'));
function print_result($data) {
if (is_array($data)) {
if (isset($data['difference']) && $data['difference'] != '') {
echo 'Current length of the '.$data['object'].' is '.$data['difference'].'<br>';
}
}
}
但不知怎的,代码只打印前两行
代码有问题吗?这与数据类型比较有关吗
提前感谢您的建议。尝试类型转换,看看结果是否相同
$int_length_1=(int)$data[0]['length_1'代码>这是一个非常古老的问题,但我今天碰巧遇到了它,决定看看它到底是怎么回事
我正在运行的代码:
<?php
$data = array(array('length_1'=>10, 'length_2'=>10));
/* OUTPUT for array(array('length_1'=>10, 'length_2'=>7));
Current length of the line is 10
Current length of the line is 7
Current length of the line is 3
*/
/* OUTPUT for array(array('length_1'=>10, 'length_2'=>10));
Current length of the line is 10
Current length of the line is 10
difference == ''
*/
$int_length_1 = $data[0]['length_1']; // length_1 is mysql integer field
print_result(array('difference' => $data[0]['length_1'], 'object' => 'line'));
$int_length_2 = $data[0]['length_2']; // length_2 is mysql integer field
print_result(array('difference' => $int_length_2, 'object' => 'line'));
// this is where weird things start to happen
// if ($data[0]['length_1'] - $data[0]['length_2']) === 0
print_result(array('difference' => ($data[0]['length_1'] - $data[0]['length_2']), 'object' => 'line'));
function print_result($data)
{
if (is_array($data))
{
// I added some conditional statements to see why OP
// wasn't getting that third output.
if (isset($data['difference']) && $data['difference'] != '') {
echo 'Current length of the '.$data['object'].' is '.$data['difference'].'<br>';
}
else if (!isset($data['difference'])) {
print "difference is not set";
}
else if ( $data['difference'] == '') {
print "difference == ''";
}
}
}
?>
做一个==代码>而不仅仅是=代码>,代码按预期工作并返回所有三行预期输出
这就是0
与空字符串的关系:
$zero = 0;
if (empty($zero)) print "empty(0) \n"; else print "!empty(0) \n";
if ($zero=='') print "0=='' \n"; else print "0!='' \n";
if ($zero==='') print "0==='' \n"; else print "0!=='' \n";
if ($zero==0) print "0==0 \n"; else print "0!=0 \n";
if ($zero===0) print "0===0 \n"; else print "0!==0 \n";
if (strlen($zero)==0) print "strlen(0)==0 \n"; else print "strlen(0)!=0 \n";
print "\n\n";
$string = '';
if (empty($string)) print "empty('') \n"; else print "!empty('') \n";
if ($string=='') print "''=='' \n"; else print "''!='' \n";
if ($string==='') print "''==='' \n"; else print "''!=='' \n";
if ($string==0) print "''==0 \n"; else print "''!=0 \n";
if ($string===0) print "''===0 \n"; else print "''!==0 \n";
if (strlen($string)==0) print "strlen('')==0 \n"; else print "strlen('')!=0 \n";
以及输出:
empty(0)
0==''
0!==''
0==0
0===0
strlen(0)!=0
empty('')
''==''
''===''
''==0
''!==0
strlen('')==0
所以。。大体上OP应该使用==
来确保一切都按照他预期的方式进行 尝试将长度强制转换为整数,即$int_length_2=(int)$data[0]['length_2'];。如果您的MySQL驱动程序以字符串形式返回int(这是出乎意料的,因此是PHP世界的标准做法)。@Tibo已经这样做了,并且没有任何更改。检查,它正常打印3行。尝试用以下内容替换echo:“echo‘example’;”以了解在您的情况下,函数是否被调用。确定,但是如果在减法中使用了类型转换的值呢?打印结果(数组('difference'=>$int\u length\u 1-$int\u length\u 2),'object'=>'line');
$zero = 0;
if (empty($zero)) print "empty(0) \n"; else print "!empty(0) \n";
if ($zero=='') print "0=='' \n"; else print "0!='' \n";
if ($zero==='') print "0==='' \n"; else print "0!=='' \n";
if ($zero==0) print "0==0 \n"; else print "0!=0 \n";
if ($zero===0) print "0===0 \n"; else print "0!==0 \n";
if (strlen($zero)==0) print "strlen(0)==0 \n"; else print "strlen(0)!=0 \n";
print "\n\n";
$string = '';
if (empty($string)) print "empty('') \n"; else print "!empty('') \n";
if ($string=='') print "''=='' \n"; else print "''!='' \n";
if ($string==='') print "''==='' \n"; else print "''!=='' \n";
if ($string==0) print "''==0 \n"; else print "''!=0 \n";
if ($string===0) print "''===0 \n"; else print "''!==0 \n";
if (strlen($string)==0) print "strlen('')==0 \n"; else print "strlen('')!=0 \n";
empty(0)
0==''
0!==''
0==0
0===0
strlen(0)!=0
empty('')
''==''
''===''
''==0
''!==0
strlen('')==0