• 5

A PHP Error was encountered

Severity: Notice

Message: Undefined index: userid

Filename: views/question.php

Line Number: 191


File: /home/prodcxja/public_html/questions/application/views/question.php
Line: 191
Function: _error_handler

File: /home/prodcxja/public_html/questions/application/controllers/Questions.php
Line: 433
Function: view

File: /home/prodcxja/public_html/questions/index.php
Line: 315
Function: require_once

I have an array with numerous dimensions, and I want to test for the existence of a cell.

The below cascaded approach, will be for sure a safe way to do it:

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

But is there a simpler way?

I'll go into more details about this:

  1. Can I perform this check in one single statement?
  2. Do I have to use array_key_exist or can I use something like isset? When do I use each and why?

isset() is the cannonical method of testing, even for multidimensional arrays. Unless you need to know exactly which dimension is missing, then something like


is perfectly acceptable, even if the [1] and [2] elements aren't there (3 can't exist unless 1 and 2 are there).

However, if you have

$arr['a'] = null;


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

comment followup:

Maybe this analogy will help. Think of a PHP variable (an actual variable, an array element, etc...) as a cardboard box:

  • isset() looks inside the box and figures out if the box's contents can be typecast to something that's "not null". It doesn't care if the box exists or not - it only cares about the box's contents. If the box doesn't exist, then it obviously can't contain anything.
  • array_key_exists() checks if the box itself exists or not. The contents of the box are irrelevant, it's checking for traces of cardboard.
  • 84
Reply Report
      • 2
    • @gidireich: for exactly that reason. To be able to differentiate between a key existing and having a null value, and a key not existing at all. Which is only a reason if you care about it.
    • with isset your checking if the key and value exists or is not null, with array_key_exists your checking if the key exists regardless if the values is null

I was having the same problem, except i needed it for some Drupal stuff. I also needed to check if objects contained items as well as arrays. Here's the code I made, its a recursive search that looks to see if objects contain the value as well as arrays. Thought someone might find it useful.

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];
        return false;

    else if(count($checkArray) > $i + 1)
        return recursiveIsset($new_var, $checkArray, $i+1);
        return $new_var;

Use: For instance

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

In my case in drupal this ment for me that the following variable existed


due note that just because '#object' is called object does not mean that it is. My recursive search also would return true if this location existed

  • 8
Reply Report

If you want to check $arr['dim1Key']['dim2Key']['dim3Key'], to be safe you need to check if all arrays exist before dim3Key. Then you can use array_key_exists.

So yes, there is a simpler way using one single if statement like the following:

if (isset($arr['dim1Key']['dim2Key']) &&
    array_key_exists('dim3Key', $arr['dim1Key']['dim2Key'])) ...
  • 0
Reply Report

Warm tip !!!

This article is reproduced from Stack Exchange / Stack Overflow, please click

Trending Tags

Related Questions