array_key_exists возвращает false, когда массив явно имеет ключ - PullRequest
1 голос
/ 28 мая 2011

Я делаю некоторый импорт контента, используя модуль импорта узлов в drupal.Моя проблема в том, что я получаю ошибки в данных, которые выглядят так, как будто они должны работать без сбоев.Это рассматриваемый код:

if (count($allowed_values) && !array_key_exists($item['value'], $allowed_values)) { //$allowed_values[$item['value']] == NULL) {
  print "||||" . $item['value'] . "||||";
  print_r($allowed_values);

И это пример того, что печатает:

|||| 1 |||| Array ([0] => no [1] => Zicam® Средство для лечения назальных спреев с холодным средством для одноразовых отверстий («Jet») |||| 1 |||| Массив ([0] => Нет [1] => Да)

Мне кажется, что это говорит о том, что «1» не находится в массиве, при печати способ «1» ясно виден.Если я заменю существующий код модуля закомментированной проверкой, ошибка не выдается.

1 Ответ

2 голосов
/ 28 мая 2011

Ваш код не полный, и я не могу воспроизвести ошибку.

Позвольте мне настроить ваш пример:

<?
$item = array('value' => 1);
$allowed_values = array(0 => 'no',1 => 'yes');

echo "needle:";
var_dump($item['value']);
echo "haystack:";
var_dump($allowed_values);

if (count($allowed_values) && !array_key_exists($item['value'], $allowed_values)) {
        echo "needle hast not been found or haystack is empty\n";
} else {
        echo "needle has been found\n";
}

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

needle:int(1)
haystack:array(2) {
  [0]=>
  string(2) "no"
  [1]=>
  string(3) "yes"
}
needle has been found

PHP также работает, когда вы назначаете игле строку, а не целое число.Это своего рода преобразование типа с потерями, которое может быть действительно удобным, но также и боль в заднице.Часто вы не знаете, что происходит, и возникают ошибки.

Но все же.Могу поспорить, у вас что-то не так с вашими типами переменных.

Вы должны выбросить их и посмотреть, что там на самом деле.

...