7

これを回避する方法があるかどうか (またはそれが可能かどうか) を考えてみてください。

したがって、これに似たコードのセクションがあります。配列キーにアクセスするときに使用されるものと同様に、角かっこを含む値を持つ文字列があります。文字列値を使用して、その配列キー自体を作成したいと思います。このコードが私の言いたいことをもう少し理解してくれることを願っています。

// String that has a value similar to an array key
$string = 'welcome["hello"]';
$$string = 'thisworks';

// I could then print the array keys value like this
print( $welcome["hello"] );

// This would hopefully output 'thisworks'.

ただし、正しく動作するようには見えません。それは可能ですか(または、他にどのように対処できますか)?

4

5 に答える 5

6

以下は、配列メンバーも解決する変数名構文に従った例です。

// String that has a value similar to an array key
$string = 'welcome["hello"]';

// initialize variable function (here on global variables store)
$vars = $varFunc($GLOBALS);

// alias variable specified by $string
$var = &$vars($string);

// set the variable
$var = 'World';

// show the variable
var_dump($welcome["hello"]); # string(5) "World"

次の実装では:

/**
 * @return closure
 */
$varFunc = function (array &$store) {
    return function &($name) use (&$store)
    {
        $keys = preg_split('~("])?(\\["|$)~', $name, -1, PREG_SPLIT_NO_EMPTY);
        $var = &$store;
        foreach($keys as $key)
        {
            if (!is_array($var) || !array_key_exists($key, $var)) {
                $var[$key] = NULL;
            }
            $var = &$var[$key];
        }
        return $var;
    };
};

PHPで変数をオーバーロードできないため、ここではPHPの表現力に制限されます。つまり、関数の戻り値としての変数参照の書き込みコンテキストがなく、追加のエイリアシングが必要になります。

$var = &$vars($string);

このようなものがニーズに合わない場合は、PHPにパッチを適用する必要があります。オプションでない場合、PHPは探している言語機能を提供していません。

関連する質問も参照してください。文字列を使用して(潜在的に大きい)多次元配列にアクセスします

于 2012-05-06T13:18:26.673 に答える
5

文字列内の可変変数の文字は文字どおりに扱われます。文字列内の内容は解釈しません。その[]ため、 内の文字は$string配列表記として扱われません。むしろ、変数名の一部として扱われます。

$$string = 'thisworks';PHP を実行すると、名前welcome["hello"]が文字どおり、値が に設定された変数が作成されthisworksます。

印刷するには、この表記法を使用します。

print (${'welcome["hello"]'});
于 2012-05-05T23:38:24.027 に答える
1

いいえ、そのような方法ではできません。または、次を使用して参照変数を設定できます

$welcomeHello = &$welcome["hello"]

そして使用する

$welcomeHello = 'thisworks'

設定項目の内容について。

これは、配列項目を設定するためのより正確で高速な方法です。

于 2012-05-05T23:38:19.460 に答える
0

eval を使用できますが、実稼働環境ではお勧めしませんが、利点があります。

<?
$string = 'welcome["hello"]';
eval('$' . $string . " = 'thisworks';");

// This also works : eval("$$string = 'thisworks';");

// I could then print the array keys value like this
print( $welcome["hello"] ); // Prints 'thisworks'
于 2012-05-05T23:35:08.267 に答える