Menggunakan kawat gigi dengan nama variabel dinamis di PHP


191

Saya mencoba menggunakan nama variabel dinamis (Saya tidak yakin apa nama sebenarnya) Tapi seperti ini:

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

var_dump($file0);

Kembalinya nullyang memberitahu saya itu tidak berfungsi. Saya tidak tahu apa sintaks atau teknik yang saya cari di sini, yang membuatnya sulit untuk diteliti. $filelistdidefinisikan sebelumnya pada.


22
Jangan ! Tidak pernah ada alasan bagus untuk menggunakannya. Mereka, secara efektif, hanya array yang tidak rapi. Gunakan array yang tepat sebagai gantinya.
Quentin

Baiklah, maaf. Saya baru saja kembali dan mengambil jawaban untuk setiap pertanyaan yang saya ajukan sejauh ini. Untung itu hanya 7: P
user1159454

2
Dan Quentin, mengapa latihan itu buruk ?? Pasti ada alasan mereka ada di samping array yang saya pikir
user1159454

@ user1159454 - Mereka adalah kekacauan yang tidak terorganisir tanpa semua alat yang dapat diterapkan ke array yang tersedia untuk mereka. Mereka ada karena alasan warisan kuno dan kasus-kasus tepi gila.
Quentin

8
Gila tepi kasus mungkin persis mengapa seseorang ingin menanyakan pertanyaan ini.
Vincent

Jawaban:


511

Bungkus mereka dalam {}:

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

Contoh Kerja


Menggunakan ${}adalah cara untuk membuat variabel dinamis, contoh sederhana:

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

4
Apakah mungkin untuk membuat array dinamis dengan logika yang sama?
dtakis

Saya memiliki keraguan yang sama tentang @takis, dapatkah Anda membantu kami? Jika memungkinkan, silakan lihat pertanyaan ini .
Marcio Mazzucato

Jut peringatan jika Anda menggunakan ini untuk memasukkan variabel (cara IMHO paling berguna) jangan lupa untuk menggunakan tanda kutip ganda. ${'fixedTime$i'} = $row['timeInstance'];memberi Anda yang tidak terlalu berguna, $fixedTime$ibukan $fixedTime1, $fixedTime2dll. (Untungnya melihatnya hampir langsung.)
BeNice

81

Gambaran

Di PHP, Anda bisa meletakkan tambahan $di depan variabel untuk menjadikannya variabel dinamis:

$$variableName = $value;

Meskipun saya tidak akan merekomendasikannya, Anda bahkan dapat mengaitkan perilaku ini:

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

Anda bisa tetapi tidak dipaksa untuk menempatkan $variableNameantara {}:

${$variableName} = $value;

Penggunaan {}hanya wajib ketika nama variabel Anda sendiri merupakan komposisi beberapa nilai, seperti ini:

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

Meskipun demikian disarankan untuk selalu menggunakan {}, karena lebih mudah dibaca.

Perbedaan antara PHP5 dan PHP7

Alasan lain untuk selalu menggunakan {}, adalah bahwa PHP5 dan PHP7 memiliki cara yang sedikit berbeda dalam berurusan dengan variabel dinamis, yang menghasilkan hasil yang berbeda dalam beberapa kasus.

Dalam PHP7, variabel dinamis, properti, dan metode sekarang akan dievaluasi secara ketat dalam urutan kiri-ke-kanan, yang bertentangan dengan campuran kasus khusus di PHP5. Contoh di bawah ini menunjukkan bagaimana urutan evaluasi telah berubah.

Kasus 1 : $$foo['bar']['baz']

  • PHP5 interpetation: ${$foo['bar']['baz']}
  • PHP7 interpetation: ${$foo}['bar']['baz']

Kasus 2: $foo->$bar['baz']

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

Kasus 3: $foo->$bar['baz']()

  • PHP5 interpetation: $foo->{$bar['baz']}()
  • PHP7 interpetation: $foo->{$bar}['baz']()

Kasus 4: Foo::$bar['baz']()

  • PHP5 interpetation: Foo::{$bar['baz']}()
  • PHP7 interpetation: Foo::{$bar}['baz']()

6
Jawaban yang bagus untuk topik yang meragukan. Saya sangat senang saya tidak perlu men-debug kode tersebut.
martinstoeckli

4
jawaban terbaik karena hanya menjawab pertanyaan tanpa menghakimi
Rid Iculous

2
Ya, kami juga mengalami masalah dengan beberapa kode lama. Produksi adalah PHP5.5, lingkungan Dev adalah PHP7. Saya menyukai pertanyaan ini.
Ogier Schelvis


5

Saya melakukan ini cukup sering pada hasil yang dikembalikan dari permintaan ..

misalnya

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

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

Sekarang saya bisa menggunakan $ MyFieldname (yang lebih mudah dalam pernyataan echo dll) daripada $ MyQueryResult ['MyFieldname']

Ya, mungkin malas, tapi saya tidak pernah punya masalah.


14
Pernahkah Anda mencoba menggunakan fungsi ekstrak () dari PHP? php.net/manual/en/function.extract.php
DarkSide

1
berguna satu-liner untuk set hasil DB: foreach ($ row as $ k => $ v) {$$ k = $ v}
Rid Iculous

2

Tom jika Anda memiliki array yang sudah ada, Anda bisa mengonversi array itu menjadi objek dan menggunakannya seperti ini:

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

0

saya punya solusi untuk nilai variabel yang dibuat secara dinamis dan menggabungkan semua nilai dalam suatu variabel.

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

0

Saya berada di posisi di mana saya memiliki 6 array identik dan saya harus memilih yang tepat tergantung pada variabel lain dan kemudian menetapkan nilai untuk itu. Dalam kasus yang ditampilkan di sini $ comp_cat adalah 'a' jadi saya harus memilih array 'a' saya (saya juga tentu saja memiliki array 'b' ke 'f')

Perhatikan bahwa nilai-nilai untuk posisi variabel dalam array pergi setelah kurung kurawal.

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

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

echo 'Nilai array pertama adalah'. $ comp_cat_a_arr [1] [0]. ' dan nilai kedua adalah $ comp_cat_a_arr [1] [1];


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.