Преобразование строки в переменную

У меня есть многомерный ассоциативный массив, который включает такие элементы, как

$data["status"] $data["response"]["url"] $data["entry"]["0"]["text"] 

У меня есть строки вроде:

 $string = 'data["status"]'; $string = 'data["response"]["url"]'; $string = 'data["entry"]["0"]["text"]'; 

Как преобразовать строки в переменную для доступа к соответствующему элементу массива? Этот метод должен работать через любой массив в любом из измерений.

Быстро и грязно:

 echo eval('return $'. $string . ';'); 

Конечно, входную строку нужно сначала дезинфицировать.

Если вам не нравятся быстрые и грязные … тогда это тоже будет работать, и это не потребует eval, из-за которого я даже съеживаюсь.

Однако он делает предположения о формате строки:

 <?php $data['response'] = array( 'url' => 'http://www.testing.com' ); function extract_data($string) { global $data; $found_matches = preg_match_all('/\[\"([az]+)\"\]/', $string, $matches); if (!$found_matches) { return null; } $current_data = $data; foreach ($matches[1] as $name) { if (key_exists($name, $current_data)) { $current_data = $current_data[$name]; } else { return null; } } return $current_data; } echo extract_data('data["response"]["url"]'); ?> 

Переменные переменные PHP помогут вам здесь. Вы можете использовать их, префиксная переменная с помощью другого знака доллара:

 $foo = "Hello, world!"; $bar = "foo"; echo $$bar; // outputs "Hello, world!" 

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

 $string = 'myvariable'; extract(array($string => $string)); echo $myvariable; 

сделанный!

Обнаружено это на странице переменных переменных :

 function VariableArray($data, $string) { preg_match_all('/\[([^\]]*)\]/', $string, $arr_matches, PREG_PATTERN_ORDER); $return = $arr; foreach($arr_matches[1] as $dimension) { $return = $return[$dimension]; } return $return; } 

Я тоже боролся с этим, у меня было это:

 $user = array('a'=>'alber', 'b'=>'brad'...); $array_name = 'user'; 

и мне было интересно, как попасть в Альберта.

сначала я попробовал

 $value_for_a = $$array_name['a']; // this dosen't work 

тогда

 eval('return $'.$array_name['a'].';'); // this dosen't work, maybe the hoster block eval which is very common 

то, наконец, я попробовал глупость:

 $array_temp=$$array_name; $value_for_a = $array_temp['a']; 

и это просто сработало Perfect! мудрость, сделайте это просто, сделайте это глупо.

Надеюсь, это ответит на ваш вопрос

Вы можете передать ссылку с помощью оператора & . Итак, в вашем примере у вас будет что-то вроде этого

 $string = &$data["status"]; $string = &$data["response"]["url"]; $string = &$data["entry"]["0"]["text"]; 

В противном случае вам нужно сделать что-то вроде этого:

 $titular = array(); for ($r = 1; $r < $rooms + 1; $r ++) { $title = "titular_title_$r"; $firstName = "titular_firstName_$r"; $lastName = "titular_lastName_$r"; $phone = "titular_phone_$r"; $email = "titular_email_$r"; $bedType = "bedType_$r"; $smoker = "smoker_$r"; $titular[] = array( "title" => $$title, "first_name" => $$firstName, "last_name" => $$lastName, "phone" => $$phone, "email" => $$email, "bedType" => $$bedType, "smoker" => $$smoker ); } 

Для этого есть встроенная функция PHP: используйте http://php.net/manual/ru/function.parse-str.php (parse_str ()).

не забудьте очистить строку от '' 'до разбора.

Вы получили бы доступ к ним, как:

 print $$string;