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


191

動的変数名を使用しようとしています(実際に何が呼び出されているのかわかりません)。

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

var_dump($file0);

戻りは、nullそれが機能していないことを私に告げるものです。私が探している構文や手法がここにあるかわかりません。そのため、調査するのが難しくなっています。$filelist以前に定義されています。


22
やめろ!それらを使用する正当な理由は決してありません。それらは事実上、整然とした配列にすぎません。代わりに適切な配列を使用してください。
クエンティン

申し訳ありません。申し訳ありませんが、これまでに行った質問ごとに戻って答えを選びました。良いことは7だけです:P
user1159454

2
そしてクエンティン、なぜ彼らは悪い習慣ですか?私が思うにアレイと並んでそれらが存在する理由があるに違いありません
user1159454

@ user1159454 —それらは、利用可能なアレイに適用できるすべてのツールがない、まとまりのない混乱です。それらは古代の遺産の理由とクレイジーなエッジケースのために存在します。
クエンティン

8
クレイジーエッジケースは、誰かがこの質問をしたいと思うまさにその理由かもしれません。
Vincent

回答:


511

それらを包む{}

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

実例


を使用する${}と、動的変数を簡単に作成できます。

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

4
同じロジックで動的配列を作成することもできますか?
dtakis 2013

@dtakisにも同じ疑問があります。手伝っていただけますか?可能であれば、この質問をご覧ください。
Marcio Mazzucato 2014

変数を含めるためにこれを使用している場合は警告を出します(IMHOで最も便利な方法)。二重引用符を使用することを忘れないでください。${'fixedTime$i'} = $row['timeInstance'];あなたは非常に有用ではない与え$fixedTime$i代わりに$fixedTime1, $fixedTime2など(幸いなことに、ほとんどすぐにそれを見つけた。)
BeNice

81

概観

PHPでは$、変数の前にエクストラを置くだけで、それを動的変数にすることができます。

$$variableName = $value;

私はお勧めしませんが、この動作を連鎖させることもできます。

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

あなたは$variableName間に置くことを強制されますが、強制されません{}

${$variableName} = $value;

{}変数の名前自体が次のように複数の値の組み合わせである場合にのみ使用する必要があります。

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

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

PHP5とPHP7の違い

常に使用するもう1つの理由{}は、PHP5とPHP7では動的変数の処理方法が少し異なるため、場合によっては結果が異なることです。

PHP7では、動的変数、プロパティ、およびメソッドが厳密に左から右の順序で評価されるようになりました。これは、PHP5での特殊なケースの混在とは対照的です。以下の例は、評価の順序がどのように変更されたかを示しています。

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

  • PHP5の干渉: ${$foo['bar']['baz']}
  • PHP7の干渉: ${$foo}['bar']['baz']

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

  • PHP5の干渉: $foo->{$bar['baz']}
  • PHP7の干渉: $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']()

6
疑わしいトピックへの良い答え。そのようなコードをデバッグする必要がないことを本当に嬉しく思います。
martinstoeckli 2016

4
正解ではなく質問に答えるだけなので、ベストアンサー
Rid Iculous

2
ええ、レガシーコードでも問題が発生しました。本番環境はPHP5.5、開発環境はPHP7でした。私はこの質問を支持しています。
Ogier Schelvis 2016


5

これは、クエリから返された結果に対して頻繁に行われます。

例えば

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

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

$ MyQueryResult ['MyFieldname']ではなく、$ MyFieldname(echoステートメントなどで簡単です)を使用できるようになりました

うん、それはおそらく怠惰ですが、私は何の問題も経験したことがありません。


14
PHPのextract()関数を使用しようとしたことがありますか?php.net/manual/en/function.extract.php
DarkSide

1
DB結果セットの便利なワンライナー:foreach($ row as $ k => $ v){$$ k = $ v}
Rid Iculous

2

トムは、既存の配列がある場合、その配列をオブジェクトに変換して、次のように使用できます。

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

0

動的に作成された変数値と、変数内のすべての値を組み合わせるためのソリューションがあります。

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

0

私は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]です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.