Преобразование строки в переменную
У меня есть многомерный ассоциативный массив, который включает в себя такие элементы, как
$data["status"]
$data["response"]["url"]
$data["entry"]["0"]["text"]
У меня есть строки вроде:
$string = 'data["status"]';
$string = 'data["response"]["url"]';
$string = 'data["entry"]["0"]["text"]';
Как преобразовать строки в переменную для доступа к правильному элементу массива? Этот метод должен работать через любой массив в любом из измерений.
Ответы
Ответ 1
Быстрая и грязная:
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('/\[\"([a-z]+)\"\]/', $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"]');
?>
Ответ 2
PHP переменные переменные помогут вам здесь. Вы можете использовать их, указав переменную другим знаком доллара:
$foo = "Hello, world!";
$bar = "foo";
echo $$bar; // outputs "Hello, world!"
Ответ 3
Это можно сделать гораздо проще. Все, что вам нужно сделать, это подумать о том, какая функция PHP предоставляет, что создает переменные.
$string = 'myvariable';
extract(array($string => $string));
echo $myvariable;
сделано!
Ответ 4
Обнаружено это на Переменные переменные:
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;
}
Ответ 5
Я тоже боролся с этим,
У меня было это:
$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!
мудрость, сделайте это просто, сделайте это глупо.
Надеюсь, это ответит на ваш вопрос.
Ответ 6
Вы можете передать ссылку с помощью оператора &
. Итак, в вашем примере у вас будет что-то вроде этого
$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
);
}
Ответ 7
Для этого есть встроенная функция PHP:
используйте http://php.net/manual/ru/function.parse-str.php (parse_str()).
не забудьте очистить строку от '' 'до разбора.
Ответ 8
Вы получили бы доступ к ним, например:
print $$string;