2014-09-26 2 views
1

У меня есть массив, который может иметь ключ "d" или нет. Значения, связанные с "d", исходят из запроса mysql. Я не хочу, чтобы показать значение "d" «S, когда онВозможно ли идентификатор массива PHP, который не существует 0?

  1. NULL
  2. "NULL"
  3. ""
  4. менее 0

Так что у меня этот сценарий:

// should show 
$a = array("a"=>1,"b"=>NULL,"c"=>"zzz"); 
if ($a["d"] >= 0) { 
    echo "show"; 
} 

// should show 
$a = array("a"=>1,"b"=>NULL,"c"=>"zzz","d"=>NULL); 
if ($a["d"] >= 0) { 
    echo "show"; 
} 

Похоже, что php распознает NULL как 0, когда "d"=>NULL. Каков наилучший способ проверить эти условия без использования array_key_exists?

+0

попробовать '$ а [ "d"]> 0 || $ a ["d"] === 0' –

+0

'if (! empty ($ a [" d "]) && $ a [" d "]! == 'NULL') && $ a [" d "] > 0) ' –

+0

if (! Empty ($ a [" d "]) && $ a [" d "] => 0) { // do stuff } – Muqito

ответ

3

Причина, по которой вы считаете, что php интерпретирует значение как 0, заключается в том, что, когда вы проводите сравнение, вы используете >=.

>= будет отображать значение слева на тип значения в правой части. Так что сравнение на самом деле больше похоже

((int) $a["d"]) >= 0 

и нуль, когда отбрасываемые к междунар, 0.

вы также можете проверить наличие этого индекса массива с помощью

isset($a['d']) 

или

empty($a['d']) 

Это недостаток наличия слабо типизированного языка, он становится запутанным, если вы не знаете, Полностью понять, что происходит. check this out for a bunch more information

+0

castis ссылается на различие между «свободным» сравнением и «строгим» сравнением. Посмотрите на [документацию PHP] (http://php.net/manual/en/types.comparisons.php) по этому вопросу, чтобы узнать больше о том, как это работает в различных сценариях. Многие языки, включая PHP, обрабатывают ненулевые значения в свободном сравнении как «правдивые». –

+0

Да, это проблема. Php обрабатывает NULL как ноль. Даже если вы делаете это 'ceil (" abc ") // float 0' Возвращает нуль. Кажется, лучше всего проверить, равна ли переменная нулю: '!is_null ($ var) && $ var === 0', в этом случае – zwitterion

+0

@ igoralves1, используя строгое сравнение, это неверно. Это означает, что после использования '===' вместо '==', '0' является единственным значением' $ var', если '$ var === 0' возвращает true. –

0

isset ваш друг

<?php 

$ar_list = array(
    array('d' => null), 
    array('d' => 0), 
    array('d' => 12), 
); 

foreach ($ar_list as $ar) { 
    if (isset($ar['d']) && $ar['d'] >= 0) { 
     echo "{$ar['d']}\n"; 
    }; 
}; 

Приведенный выше пример выведет:

0 
12