php считает числовое значение пустой строкой (странное поведение) - PullRequest
1 голос
/ 12 октября 2011

Это мой собственный код, который сбивал с толку более 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>';
        }       
    }
}

ожидаемый результат:

Current length of the line is 10
Current length of the line is 7
Current length of the line is 3

но почему-то код печатает только первые 2 строки.

что-то не так с кодом?это как-то связано со сравнением типов данных?

Заранее спасибо за любые предложения.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2013

Это действительно старый вопрос, но я случайно натолкнулся на него сегодня и решил посмотреть, что с ним.

Код, который я запускал:

<?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 == ''"; 
        }
    }
}

?>

если вы измените эту строку:

if (isset($data['difference']) && $data['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        

Итак ... в основном ... ОП должен был использовать ===, чтобы убедиться, что все работает так, как он ожидал.

0 голосов
/ 12 октября 2011

Попробуйте набрать тип и посмотрите, совпадают ли результаты

$int_length_1 = (int) $data[0]['length_1'];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...