Как отправить имя индекса для php–массива vairable.
массив
$array = array('Somthing'=>array('More'=>array('id'=> 34)));
и теперь я хочу показать эту вещь, но с именем переменной я не знаю, как объяснить, поэтому я пишу то, что хочу.
$index_name = '[Something][More][id]'; $array{$index_name};
Возможно ли это каким-либо образом?
Не в одном так. Вот как вы это сделаете:
$array['Something']['More']['id']
Если вам особенно хотелось получить доступ к многомерным массивам с помощью одной строки, вы могли бы создать функцию для этого:
function array_multi(Array $arr, $path) { $parts = explode(".", $path); $curr =& $arr; for ($i = 0, $l = count($parts); $i < $l; ++$i) { if (!isset($curr[$parts[$i]])) { // path doesn't exist return null; } else if (($i < $l - 1) && !is_array($curr[$parts[$i]]) { // path doesn't exist return null; } $curr =& $curr[$parts[$i]]; } return $curr; } // usage: echo array_multi($array, "Something.More.id"); // 34 echo array_multi($array, "Something.More"); // array("id" => 34)
Рекурсивная версия, поддерживающая ваш синтаксис с квадратными скобками:
$array = array('Something'=>array('More'=>array('id'=> 34))); $string = '[Something][More][id]'; echo scan_array($string, $array); function scan_array($string, $array) { list($key, $rest) = preg_split('/[[\]]/', $string, 2, PREG_SPLIT_NO_EMPTY); if ( $key && $rest ) { return scan_array($rest, $array[$key]); } elseif ( $key ) { return $array[$key]; } else { return FALSE; } }
Хорошо, я знаю, что это то, как люди стреляют. Но c'mon, eval()
не всегда является неправильным ответом.
$array = array('Something'=>array('More'=>array('id'=> 34))); $index_name = '[Something][More][id]'; eval('$val = $array'.$index_name.';'); // Wrap in a function or something
Вы можете сделать это с помощью eval () :
<?php $array = array('Somthing'=>array('More'=>array('id'=> 34))); $index_name = "['Somthing']['More']['id']"; $stmt='echo $array'.$index_name.';'; eval($stmt); ?>
ОБНОВИТЬ:
Кажется, некоторым пользователям SO неудобно идея использования eval (). Я думаю, что имеет смысл прочитать эту тему, в которой обсуждаются плюсы и минусы, прежде чем решать, использовать ли это в своем собственном коде.
Если вы загнали себя в угол, чтобы сделать что-то подобное, есть неплохие шансы, что вы сделали что-то еще плохо. Для этого есть веские причины, но не очень часто.
function key_path($arr, $keys) { return $keys ? key_path($arr[array_shift($keys)], $keys) : $arr; } $arr['Something']['More']['id'] = 34; $keys = array('Something', 'More', 'id'); var_dump( key_path($arr, $keys));