php将数值视为空字符串(奇怪的行为)

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

这是我自己的代码,混淆了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 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