Найти значение ключа во вложенном многомерном массиве - PullRequest
0 голосов
/ 12 июня 2018

У меня есть такие данные массива

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

Мой код выглядит примерно так

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

Я хочу проверить, доступен ли ключ "video_info" в массиве или нет

Я пробовал эту функцию, но она не работает

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";
    }

Пожалуйста, помогите мне

Исходный массив - https://pastebin.com/2Qy5cADF

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вот мой подход к написанию функции для проверки ключей вашего массива с использованием классов рекурсивного итератора ...

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
0 голосов
/ 12 июня 2018

попробуйте что-то вроде этого (рекурсия)

$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;
        }
    }
}

Небольшое примечание: эта функция значительно быстрее принятого ответа (коэффициент 4x)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...