0

I have an array data like this

    $array = Array ( 
         [abc] => Array ( ) 
         [def] => Array ( )
         [hij] => Array ( ) 
             [media] => Array ( 
                 [video_info] => Array ( ) 
                        [video_variants] => Array ( ) 
                                [1] => Array ( )
                                [2] => Array ( )
    ) 
) 

My code looks something like this

foreach($response->extended_entities->media as $media)
        {
        stuffs
           foreach ($media->video_info->variants as $video) 
               {
               stuffs
               }
        }

I want to check whether the "video_info Key is available in the array or not

I have tried this function but it doesn't work

function multi_array_key_exists($key, $array) {
    if (array_key_exists($key, $array))
        return true;
    else {
        foreach ($array as $nested) {
            foreach ($nested->media as $multinest) {
        if (is_array($multinest) && multi_array_key_exists($key, $multinest))
                return true;
        }
    }
    }
    return false;
}


 if (multi_array_key_exists('video_info',$response) === false)
    {
        return "failed";
    }

Please help me

Original array - https://pastebin.com/2Qy5cADF

2 Answers2

1

try something like this (recursion)

$key = "video_info";
$invoke = findKey($array, $key);

function findKey($array, $key)
{
    foreach ($array as $key0 => $value) {
        if (is_array($value)) {
            if ($key === $key0) {
                echo 'hit: key ' . $key . ' is present in the array';
                return true;
            }
            findKey($value, $key); // recursion
        } elseif ($key === $key0) {
            echo 'hit: key ' . $key . ' is present in the array';
            return true;
        } else {
            return false;
        }
    }
}

A small note: this function is significantly faster than the accepted answer (factor 4x)

jibsteroos
  • 1,366
  • 2
  • 7
  • 13
  • Hi, when you recurse into `findKey()` from within, it prints that it found the key but its return boolean isn't passed back to the parent level, eg `if(findKey($value,$key)){return true;}` – Scuzzy Jun 11 '18 at 23:01
  • also I feel the duplication of your `$key === $key0` check is redundant and could be the first action performed within the foreach loop, then when the key doesn't match and the value is an array, recurse and return if true. https://3v4l.org/mISe1 – Scuzzy Jun 11 '18 at 23:15
  • Also you are spot on about performance, I just benched our two solutions, and your one is faster, but only once you start hitting the thousands of repeat calls. – Scuzzy Jun 11 '18 at 23:24
  • 1
    @scuzzy - fair remarks, admittedly it was just a quick little spike I wrote to hand the OP a possible solution with recursion - thanks. – jibsteroos Jun 12 '18 at 08:06
1

Here's my approach at writing a function to check the keys of your array using the Recursive Iterator classes...

function isArrayKeyAnywhere( $array, $searchKey )
{
  foreach( new RecursiveIteratorIterator( new RecursiveArrayIterator( $array ), RecursiveIteratorIterator::SELF_FIRST ) as $iteratorKey => $iteratorValue )
  {
    if( $iteratorKey == $searchKey )
    {
      return true;
    }
  }
  return false;
}

$array = [
  'abc'=>[],
  'def'=>[],
  'hij'=>[
    'media'=>[
      'video_info'=>[
        'video_variants'=>[
          [],
          []
        ]
      ]
    ]
  ]
];

var_dump( isArrayKeyAnywhere( $array, 'video_info' ) ); // true
var_dump( isArrayKeyAnywhere( $array, 'foo_bar' ) ); // false
Scuzzy
  • 12,186
  • 1
  • 46
  • 46
  • I really like the SPL Iterator classes because it helps you to do a lot of the heavy lifting with this type of task. http://php.net/manual/en/spl.iterators.php – Scuzzy Jun 11 '18 at 22:32