Как я могу извлечь только определенные уровни из многомерного массива?

Это мой массив:

array(1) {
      ["farm"]=>
      array(2) {
        ["folder1"]=>
        array(2) {
          ["horse"]=>
          array(1) {
            ["fred.jpg"]=>
            string(30) "farm/folder1/horse/fred.jpg"
          }
          ["cat"]=>
          array(1) {
            ["john.jpg"]=>
            string(28) "farm/folder1/cat/john.jpg"
          }
        }
        ["folder2"]=>
        array(1) {
          ["cat"]=>
          array(2) {
            ["sam.jpg"]=>
            string(27) "farm/folder2/cat/sam.jpg"
            ["cat"]=>
            array(1) {
              ["john.jpg"]=>
              string(32) "farm/folder2/cat/cat/john.jpg"
            }
          }
        }
      }
    }

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

Например, если моя переменная folder1 мой массив должен выглядеть примерно так:

          array(1) {
            ["folder1"]=>
            array(2) {
              ["horse"]=>
             string(0) "" //the value is not important, only the key
              ["cat"]=>
            string(0) ""
            } 
         }

И если моя переменная farm результат должен выглядеть так

array(1) {
          ["farm"]=>
          array(2) {
            ["folder1"]=>
           string(0) "" 
            ["folder2"]=>
            string(0) ""    
          }
        }

Я действительно не знаю, как это сделать, поэтому вот мой эксперимент:

function myfunction($array, $var){
  $newArray = array();
  $newArray = $array[$var][0];
  return $newArray;
}

Мой результат NULL;

2 ответа

Решение

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

function get_key($haystack, $needle) {
    if (is_array($haystack)) {                       // don't search non-array values
        foreach ($haystack as $key => $value) {
            if ($key == $needle) {                   // if searched key is found
                if (is_array($value) {
                    foreach ($value as &$subvalue) { // set any child keys to ''
                        $subvalue = '';
                    }
                }
                return array($needle => $value);     // and return the result.

            } else {                                 // If it isn't found, 
                $result = get_key($value, $needle);  // try to find it in the next level
                if ($result) return $result;         // and return it if it's found.
            }
        }
    }
    // implicitly returns null if the key is not found
}

$result = get_key($your_array, 'folder1');

Попробуйте с этим:

function multiKeyArray(array $arr, $key) {

        // is in base array?
        if (array_key_exists($key, $arr)) {
            return $arr[$key];
        }

        // check arrays contained in this array
        foreach ($arr as $element) {
            if (is_array($element)) 
                return multiKeyArray($element, $key);               
        }

        return false;
}

$result = multiKeyArray($input, 'farm');
Другие вопросы по тегам