сбой ошибки array_key_exists - PullRequest
       9

сбой ошибки array_key_exists

0 голосов
/ 30 августа 2018

Вполне возможно, что это НЕ то, что можно воспроизвести с помощью копирования и вставки. У меня проблема в том, что array_key_exists просто не работает.

Я напечатал свой код на странице; это определенно тип массив, не то, что требуется. Ключ массива существует; Я произвел приведение между строкой и целым числом, и оно возвращается не найденным.

Теперь, где это становится самым загадочным, я итерировал между

$presets    = $this->presets->$name;
echo gettype($version).'<br>';
foreach ( $presets as $key=>$test ) {
    if ( $key===$version ) echo 'string found1<br>';
    elseif ( $key==$version ) echo 'string found2<br>';
}
if ( !array_key_exists($version,$presets) )
    echo 'array_key_exists string fail.<br>';

$version = intval($version);
echo gettype($version).'<br>';
foreach ( $presets as $key=>$test ) {
    if ( $key===$version ) echo 'int found1<br>';
    elseif ( $key==$version ) echo 'int found2<br>';
}
if ( !array_key_exists($version,$presets) )
    echo 'array_key_exists int fail.<br>';

Выход:

string
string found1
array_key_exists string fail.
integer
int found2
array_key_exists int fail.

Вывод абсолютно странный, поскольку в обоих запросах int & string ключ совпадает. Фактически, в поиске string он выводит «string found1», что означает, что он === ключ в массиве. Итак, почему array_key_exists ВСЕГДА производит FALSE?

Переменная $presets - это некоторый массив, индексы которого создаются с использованием кодов регулярных выражений preg_match для анализа индексов. Это единственная загадка, которую я могу придумать, хотя ручное сравнение показало, что было обнаружено значение ===, и поэтому ничего из этого не должно иметь значения. array_key_exists должен вернуть TRUE

  Array
  (
      [100] => stdClass Object
          ()
  )

1 Ответ

0 голосов
/ 30 августа 2018

На основании результатов, полученных вами от $key==$version и $key===$version, мы знаем, что ключ является числовой строкой. Похоже, вы используете версию PHP <7.2. </p>

В этих версиях вы не можете ссылаться на ключ массива числовых строк, и array_key_exists вернет false, если вы дадите ключ в числовом или строковом виде. Это запутанное поведение было улучшено в PHP 7.2.

Вот демонстрация , иллюстрирующая это, на примере этого ответа .

...