У меня есть строка, содержащая элементы из массива.
$str = '[some][string]'; $array = array();
Как я могу получить значение $array['some']['string']
используя $str
?
Вы можете сделать это, используя eval, не знаете, нравится ли вам это:
$array['some']['string'] = 'test'; $str = '[some][string]'; $code = sprintf('return $array%s;', str_replace(array('[',']'), array('[\'', '\']'), $str)); $value = eval($code); echo $value; # test
Однако eval не всегда является правильным инструментом, потому что хорошо, он чаще всего показывает, что у вас есть недостаток дизайна, когда вам нужно его использовать.
Другой пример, если вам нужно написать доступ к элементу массива, вы можете сделать следующее:
$array['some']['string'] = 'test'; $str = '[some][string]'; $path = explode('][', substr($str, 1, -1)); $value = &$array; foreach($path as $segment) { $value = &$value[$segment]; } echo $value; $value = 'changed'; print_r($array);
Это фактически тот же принцип, что и в ответе Эрика, но ссылающийся на переменную.
Это будет работать для любого количества ключей:
$keys = explode('][', substr($str, 1, -1)); $value = $array; foreach($keys as $key) $value = $value[$key]; echo $value
// trim the start and end brackets $str = trim($str, '[]'); // explode the keys into an array $keys = explode('][', $str); // reference the array using the stored keys $value = $array[$keys[0][$keys[1]];
Я думаю, что regexp должен сделать трюк лучше:
$array['some']['string'] = 'test'; $str = '[some][string]'; if (preg_match('/\[(?<key1>\w+)\]\[(?<key2>\w+)\]/', $str, $keys)) { if (isset($array[$keys['key1']][$keys['key2']])) echo $array[$keys['key1']][$keys['key2']]; // do what you need }
Но я бы подумал дважды, прежде чем обращаться с массивами по-своему: D