PHP: тестирование существования ячейки в многомерном массиве

У меня есть массив с многочисленными размерами, и я хочу проверить наличие ячейки.

Под каскадным подходом, безусловно, будет безопасный способ сделать это:

if (array_key_exists($arr, 'dim1Key')) if (array_key_exists($arr['dim1Key'], 'dim2Key')) if (array_key_exists($arr['dim1Key']['dim2Key'], 'dim3Key')) echo "cell exists"; 

Но есть ли более простой способ?

Я расскажу подробнее об этом:

  1. Могу ли я выполнить эту проверку в одном заявлении?
  2. Должен ли я использовать array_key_exist или я могу использовать что-то вроде isset? Когда я использую каждый и почему?

isset() – это канонический метод тестирования, даже для многомерных массивов. Если вам не нужно точно знать, какое измерение отсутствует, то что-то вроде

 isset($arr[1][2][3]) 

вполне приемлемо, даже если элементы [1] и [2] отсутствуют (3 не может существовать, если только 1 и 2).

Однако, если у вас есть

 $arr['a'] = null; 

тогда

 isset($arr['a']); // false array_key_exists('a', $arr); // true 

комментарий:

Может быть, эта аналогия поможет. Подумайте о переменной PHP (фактическая переменная, элемент массива и т. Д.) В виде картонной коробки:

  • isset() заглядывает в поле и выясняет, может ли содержимое окна быть приложено к чему-то, что «не пусто». Не имеет значения, существует ли коробка или нет – она ​​заботится только о содержимом коробки. Если ящик не существует, то он, очевидно, ничего не может содержать.
  • array_key_exists() проверяет, существует ли сама коробка или нет. Содержимое коробки не имеет значения, оно проверяет следы картона.

У меня была та же проблема, кроме того, что мне это нужно для некоторых вещей Drupal. Мне также нужно было проверить, содержат ли объекты элементы, а также массивы. Вот код, который я сделал, его рекурсивный поиск, который пытается увидеть, содержат ли объекты значение, а также массивы. Думал, что кто-то может найти это полезным.

 function recursiveIsset($variable, $checkArray, $i=0) { $new_var = null; if(is_array($variable) && array_key_exists($checkArray[$i], $variable)) $new_var = $variable[$checkArray[$i]]; else if(is_object($variable) && array_key_exists($checkArray[$i], $variable)) $new_var = $variable->$checkArray[$i]; if(!isset($new_var)) return false; else if(count($checkArray) > $i + 1) return recursiveIsset($new_var, $checkArray, $i+1); else return $new_var; } 

Использование: например

 recursiveIsset($variables, array('content', 'body', '#object', 'body', 'und')) 

В моем случае в drupal это для меня, что существует следующая переменная

 $variables['content']['body']['#object']->body['und'] 

обратите внимание, что только потому, что «#object» называется объектом, это не значит, что это так. Мой рекурсивный поиск также вернет true, если это место существовало

 $variables->content->body['#object']->body['und']