web-dev-qa-db-ja.com

文字列を変数に変換する

私はのような要素を含む多次元の連想配列を持っています

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

私は次のような文字列を持っています:

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

文字列を変数に変換して適切な配列要素にアクセスするにはどうすればよいですか?このメソッドは、任意の次元の任意の配列にわたって機能する必要があります。

18
Gilean

素早く汚い:

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

PHP 変数変数 が役立ちます。変数の前に別のドル記号を付けることで、これらを使用できます。

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

これははるかに簡単な方法で行うことができます。あなたがしなければならないのは、変数を作成する関数PHPが提供するものについて考えることです。

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

できた!

6
Brandon S

演算子&を使用して参照渡しすることができます。だからあなたの例ではあなたはこのようなものを持っているでしょう

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

私もそれに苦労していました、私はこれを持っていました:

$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'];

そして、これは完璧に働きました!知恵、それは単純にそれを愚かにしてください。

これがあなたの質問に答えることを願っています

0
user763694

おそらくこのオプションも適しています:

$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]));

追伸それは私にとっては仕事です。

0
kalitin.nikita

次のようにアクセスします。

print $$string;
0
MattBelanger

ネイティブPHP関数:使用 http://php.net/manual/ru/function.parse-str.php (parse_str()))があります。

解析する前に「」から文字列をクリーンアップすることを忘れないでください。

0
Dima Storozhuk

これは 変数変数 ページで見つかりました:

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