web-dev-qa-db-fra.com

Convertir une chaîne en variable

J'ai un tableau associatif multidimensionnel qui comprend des éléments tels que

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

J'ai des cordes comme:

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

Comment puis-je convertir les chaînes en une variable pour accéder au bon élément de tableau? Cette méthode devra fonctionner sur n'importe quel tableau à n'importe quelle dimension.

17
Gilean

Rapide et sale: 

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

Bien sûr, la chaîne d'entrée devra être préalablement nettoyée.

Si vous n'aimez pas rapide et sale ... alors cela fonctionnera aussi et il ne nécessite pas d'évaluation qui me fait même grincer des dents.

Il fait cependant des hypothèses sur le format de chaîne:

<?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"]');
?>
14
Allain Lalonde

PHP variables variables va vous aider ici. Vous pouvez les utiliser en préfixant la variable avec un autre signe dollar:

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

Cela peut être fait d'une manière beaucoup plus simple. Il suffit de penser à la fonction PHP qui crée des variables. 

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

terminé!

6
Brandon S

Vous pouvez passer par référence avec l'opérateur &. Donc, dans votre exemple, vous aurez quelque chose comme ça

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

Sinon, vous devez faire quelque chose comme ça:

$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
    );
}
0
gus

Je me débattais aussi avec ça, J'avais ceci: 

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

$array_name = 'user';

et je me demandais comment entrer dans Albert. 

au début j'ai essayé 

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

puis 

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

puis finalement j'ai essayé la chose stupide: 

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

et cela a juste fonctionné Parfait! sagesse, fais-le simplement fais-le stupide. 

J'espère que cela répond à votre question 

0
user763694

Peut-être que cette option est également appropriée:

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

function getIn($arr, $params)
{
    if(!is_array($arr)) {
        return null;
    }
    if (array_key_exists($params[0], $arr) && count($params) > 1) {
        $bf = $params[0];
        array_shift($params);
        return getIn($arr[$bf], $params);
    } elseif (array_key_exists($params[0], $arr) && count($params) == 1) {

        return $arr[$params[0]];
    } else {
        return null;
}
}

preg_match_all('/(?:(\w{1,}|\d))/', $string, $arr_matches, PREG_PATTERN_ORDER);

array_shift($arr_matches[0]);
print_r(getIn($data, $arr_matches[0]));

P.s. c'est un travail pour moi.

0
kalitin.nikita

Il existe une fonction native PHP pour cela: Utilisez http://php.net/manual/ru/function.parse-str.php (parse_str ()).

n'oubliez pas de nettoyer la chaîne de '"' avant de l'analyser.

0
Dima Storozhuk

Trouvé ceci sur la Variables variables page:

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; 
} 
0
Gilean