2009-12-27 2 views
0

У меня есть уникальный случай, когда у меня есть массив следующим образом:Доступ к файлам php-массива через параметры?

$a = array('a' => array('b' => array('c' => 'woohoo!'))); 

Я хочу, чтобы получить доступ к значениям массива таким образом, как это:

  • some_function($a, array('a')), который будет возвращать массив для позиции
  • some_function($a, array('a', 'b', 'c')), который вернул бы слово 'Woohoo'

Итак, в основном, он сверляется в массиве с использованием переданных в переменных во втором параметре и проверяет наличие этого ключа в результате. Любые идеи о некоторых родных php-функциях, которые могут это сделать? Я предполагаю, что нужно будет использовать рекурсию. Любые мысли были бы действительно оценены.

Спасибо.

ответ

2

Это непроверенное, но вам не нужно рекурсия обрабатывать этот случай:

function getValueByKey($array, $key) { 
    foreach ($key as $val) { 
     if (!empty($array[$val])) { 
      $array = $array[$val]; 
     } else return false; 
    } 
    return $array; 
} 
+0

wow , я не знаю, как ты так быстро взбивал, но, спасибо, чувак. именно то, что я искал. – onassar

1

$a['a'] возвращает массив в позиции a.
$a['a']['b']['c']woohoo.

Не так ли?

+0

не мог сделать это, как я не хотел явно написать доступ к значению, так как она может изменяться. Спасибо хоть! – onassar

2

Вот рекурсивная реализация:

function some_function($array, $path) { 
    if (!count($path)) { 
     return; 
    } 
    $key = array_shift($path); 
    if (!array_key_exists($key, $array)) { 
     return; 
    } 
    if (count($path) > 1) { 
     return some_function($array[$key], $path); 
    } else { 
     return $array[$key]; 
    } 
} 

И итеративный реализация:

function some_function($array, $path) { 
    if (!count($path)) { 
     return; 
    } 
    $tmp = &$array; 
    foreach ($path as $key) { 
     if (!array_key_exists($key, $tmp)) { 
      return; 
     } 
     $tmp = &$tmp[$key]; 
    } 
    return $tmp; 
} 

Эти функции будут возвращать Null если путь не является допустимым.

+0

Ваш нерекурсивный работает примерно так же, как выбранный выше. Спасибо хоть. я ценю это! – onassar

+2

@onassar: Но использование 'array_key_exists' более безопасно, так как' empty' возвращает * true * для значений типа '' '', * null *, * false *, 'array()', '0' и' "0" '. – Gumbo

+0

правда, что! Спасибо, сэр. Я модифицировал мой, чтобы использовать это. я делаю ставку, что бы побить меня по заднице вниз по линии и привело к часам отладки :(спасибо! – onassar

2

Вы можете попробовать с RecursiveArrayIterator

Вот example on how to use it.

+0

спасибо за подсказку, но выше, который не использует рекурсию, является предпочтительным. намного проще следовать :) – onassar

Смежные вопросы