Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 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;