isset возвращает true в массиве, когда его родительским значением является строка not, а array - PullRequest
2 голосов
/ 03 ноября 2011

Я столкнулся со странной проблемой с одним из моих массивов.Массив выглядит следующим образом, тогда я выполняю print_r () для него:

Array
(
    [id] => 1688
    [pCid] => 1992
    [category] => 177
    [archive] => 0
    [catid] => 
    [pid] => 
    [order_nr] => 1
    [cOrder] => 1
    [cSeo] => no-colour
    [order_id] => 0
    [price] => 8.99
    [sale_price] => 7.99
    [sale_expiry] =>
    [oPrices] => 7.99
    [member_price] => 6.99
    [set] => 0
)

, и когда я делаю простое

if(isset($array['set']['stock'])){}

, он возвращает true, когда $ array ['set'] currentlly равно 0.

var_dump(isset($array['set']['stock'])) //bool(true)

возвращает true

Любые идеи, почему это происходит?

(Я решил проблему с проверкой, выполнив is_array ($ array ['set']) проверьте, но все еще не уверены, почему isset не работает)

Я заметил, что вы можете повторить ту же проблему, как это:

<?php
$colour = array();
$colour['set'] = '0';

var_dump(isset($colour['set']['stock'])); //will return true
?>

Ответы [ 3 ]

1 голос
/ 03 ноября 2011

Строка - это массив символов. Когда сравнивается массив ['stock'], он сравнивает первый символ, глядя на строку.

<?php
$colour = array();
$colour['set'] = 'foo';

var_dump($colour['set']['stock']); // Returns 'f'
?>

Например, возвращает 'f'.

0 голосов
/ 03 ноября 2011

В PHP (как и в большинстве других языков) строки могут быть доступны как массивы символов.

Поэтому, когда вы делаете $str['stock'], вы действительно получаете доступ к смещению 'stock' в $str.Поскольку строки имеют только числовые смещения, строка 'stock' приводится к целому числу и, поскольку она не содержит никаких чисел, результат равен 0.Таким образом, вы получаете доступ к $str[0], который является первым установленным символом строки.

0 голосов
/ 03 ноября 2011

isset () проверяет, существует ли конкретная переменная или элемент массива.Переменная / элемент, содержащий НИЧЕГО, включая null или 0, все еще установлена, поскольку она существует.Если вы хотите проверить ненулевое содержимое, используйте вместо этого empty(), который вернется к истине, если переменная существует, но содержит '', null, 0, '0' и т. Д. Однаковам все равно нужно будет выполнить тест isset, поскольку empty () вызовет предупреждение «нет такого ключа массива», если вы попытаетесь запустить его на ключе массива, который действительно не существует.

...