web-dev-qa-db-ja.com

PHPで動的変数名を使用して中括弧を使用する

私は動的変数名を使おうとしています(実際に何が呼ばれているのかよくわかりません)。

for($i=0; $i<=2; $i++) {
    $("file" . $i) = file($filelist[$i]);
}

var_dump($file0);

戻り値はnullです。これは機能していないことを示しています。私が探している構文やテクニックが何であるかは私にはわかりません。そのため研究が困難です。 $filelistは先に定義されています。

168
user1159454

それらを{}で囲みます。

${"file" . $i} = file($filelist[$i]);

実施例


${}を使うことは動的変数を作る方法です、簡単な例:

${'a' . 'b'} = 'hello there';
echo $ab; // hello there
460
Sarfraz

概要

PHPでは、変数の前に余分な$を追加して動的変数にすることができます。

$$variableName = $value;

私はそれをお勧めしませんが、この振る舞いを連鎖することさえできます。

$$$$$$$$DoNotTryThisAtHomeKids = $value;

$variableName{}の間に入れることはできますが、強制されません。

${$variableName} = $value;

{}の使用は、あなたの変数の名前がそれ自身が複数の値の組み合わせである場合にのみ必須です。

${$variableNamePart1 . $variableNamePart2} = $value;

それでも読みやすいので、常に{}を使用することをお勧めします。

PHP 5とPHP 7の違い

常に{}を使用するもう1つの理由は、PHP 5とPHP 7では動的変数を扱う方法が少し異なるため、結果が異なる場合があることです。

PHP 7では、動的変数、プロパティ、およびメソッドは、PHP 5の特殊なケースの組み合わせとは対照的に、厳密に左から右の順に評価されるようになりました。以下の例は、評価の順序がどのように変化したかを示しています。

ケース1:$$foo['bar']['baz']

  • PHP5への侵入:${$foo['bar']['baz']}
  • PHP7のinterpetation:${$foo}['bar']['baz']

ケース2:$foo->$bar['baz']

  • PHP5への侵入:$foo->{$bar['baz']}
  • PHP7のinterpetation:$foo->{$bar}['baz']

ケース3:$foo->$bar['baz']()

  • PHP5への侵入:$foo->{$bar['baz']}()
  • PHP7への干渉:$foo->{$bar}['baz']()

ケース4:Foo::$bar['baz']()

  • PHP5への侵入:Foo::{$bar['baz']}()
  • PHP7への干渉:Foo::{$bar}['baz']()
69
John Slegers

{}の代わりに()を使ってみてください。

${"file".$i} = file($filelist[$i]);
20

私はクエリから返された結果に対して非常に頻繁にこれを行います。

例えば.

// $MyQueryResult is an array of results from a query

foreach ($MyQueryResult as $key=>$value)
{
   ${$key}=$value;
}

$ MyQueryResult ['MyFieldname']ではなく$ MyFieldname(これはエコーステートメントなどのほうが簡単です)を使用できます。

うん、それはおそらく怠惰だが、私は何の問題も抱えていなかった。

4
Tom

Tomもしあなたが既存の配列を持っていれば、その配列をオブジェクトに変換して次のように使うことができます。

$r = (object) $MyQueryResult;
echo $r->key;
2
corysus

()の代わりに{}を使ってみてください。

${"file".$i} = file($filelist[$i]);
0
Vildan Bina

私は6つの同一の配列を持っていた立場にいたので、他の変数に応じて正しいものを選び、それに値を代入する必要がありました。ここで示されているケースでは$ comp_catは 'a'だったので、私は 'a'配列を選ぶ必要がありました(もちろん私は 'b'から 'f'配列も持っていました)

配列内の変数の位置の値は右中括弧の後にくることに注意してください。

$ {'comp_cat _'。$ comp_cat .'_ arr '} [1] [0] = "FRED BLOGGS";

$ {'comp_cat _'。$ comp_cat .'_ arr '} [1] [1] = $ file_tidy;

echo '最初の配列値は'。$ comp_cat_a_arr [1] [0]です。 2番目の値は$ comp_cat_a_arr [1] [1]です。

0
M61Vulcan

私は動的に作成された変数値と変数のすべての値を組み合わせたための解決策があります。

if($_SERVER['REQUEST_METHOD']=='POST'){
    $r=0;
    for($i=1; $i<=4; $i++){
        $a = $_POST['a'.$i];
        $r .= $a;
    }
    echo $r;
}
0
Murad