Intereting Posts

php call array из строки

У меня есть строка, содержащая элементы из массива.

$str = '[some][string]'; $array = array(); 

Как я могу получить значение $array['some']['string'] используя $str ?

Solutions Collecting From Web of "php call array из строки"

Вы можете сделать это, используя 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