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.
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"]');
?>
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!"
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é!
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
);
}
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
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.
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.
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;
}