ใช้วงเล็บปีกกากับชื่อตัวแปรแบบไดนามิกใน 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
เคส Crazy edge อาจเป็นเหตุผลว่าทำไมบางคนต้องการถามคำถามนี้
Vincent

คำตอบ:


512

ห่อไว้ใน{}:

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

ตัวอย่างการทำงาน


การใช้${}เป็นวิธีสร้างตัวแปรแบบไดนามิกตัวอย่างง่ายๆ:

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

4
เป็นไปได้ไหมที่จะสร้างอาร์เรย์แบบไดนามิกด้วยตรรกะเดียวกัน
dtakis

ฉันมีข้อสงสัยเหมือนกันกับ @dtakis คุณช่วยเราได้ไหม? ถ้าเป็นไปได้โปรดดูคำถามนี้
Marcio Mazzucato

เพียงแค่เตือนถ้าคุณใช้สิ่งนี้เพื่อรวมตัวแปร (วิธีที่มีประโยชน์มากที่สุด IMHO) อย่าลืมใช้เครื่องหมายคำพูดคู่ ${'fixedTime$i'} = $row['timeInstance'];ให้ประโยชน์ไม่มาก$fixedTime$iแทน$fixedTime1, $fixedTime2เป็นต้น (โชคดีที่เห็นมันเกือบจะทันที)
BeNice

82

ภาพรวม

ใน PHP คุณสามารถใส่ส่วนเสริม$ไว้ด้านหน้าของตัวแปรเพื่อให้เป็นตัวแปรแบบไดนามิก:

$$variableName = $value;

แม้ว่าฉันจะไม่แนะนำก็ตามคุณยังสามารถเชื่อมโยงพฤติกรรมนี้:

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

คุณสามารถ แต่ไม่บังคับให้ใส่$variableNameระหว่าง{}:

${$variableName} = $value;

การใช้{}บังคับเฉพาะเมื่อชื่อตัวแปรของคุณเป็นองค์ประกอบหลายค่าเช่นนี้:

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

อย่างไรก็ตามขอแนะนำให้ใช้เสมอ{}เพราะสามารถอ่านได้มากขึ้น

ความแตกต่างระหว่าง PHP5 และ PHP7

อีกเหตุผลหนึ่งที่ใช้กันเสมอ{}คือ PHP5 และ PHP7 มีวิธีจัดการตัวแปรแบบไดนามิกที่แตกต่างกันเล็กน้อยซึ่งส่งผลให้เกิดผลลัพธ์ที่แตกต่างกันในบางกรณี

ใน PHP7 ตัวแปรแบบไดนามิกคุณสมบัติและเมธอดจะถูกประเมินอย่างเข้มงวดตามลำดับจากซ้ายไปขวาเมื่อเทียบกับกรณีพิเศษใน PHP5 ตัวอย่างด้านล่างแสดงว่าลำดับการประเมินมีการเปลี่ยนแปลงอย่างไร

กรณีที่ 1: $$foo['bar']['baz']

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

กรณีที่ 2: $foo->$bar['baz']

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

กรณีที่ 3: $foo->$bar['baz']()

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

กรณีที่ 4: Foo::$bar['baz']()

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

6
คำตอบที่ดีสำหรับหัวข้อที่น่าสงสัย ฉันดีใจจริงๆที่ฉันไม่ต้องแก้ปัญหารหัสดังกล่าว
martinstoeckli

4
คำตอบที่ดีที่สุดเพราะเพียงแค่ตอบคำถามโดยไม่ตัดสิน
กำจัด Iculous

2
ใช่เราเพิ่งมีปัญหากับรหัสดั้งเดิมบางอย่างเช่นกัน การผลิตคือ PHP5.5, สภาพแวดล้อม Dev คือ PHP7 ฉันชอบคำถามนี้
Ogier Schelvis


5

ฉันทำสิ่งนี้บ่อยครั้งในผลลัพธ์ที่ส่งคืนจากแบบสอบถาม

เช่น

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

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

ตอนนี้ฉันสามารถใช้ $ MyFieldname (ซึ่งง่ายกว่าใน echo statement และอื่น ๆ ) แทนที่จะเป็น $ MyQueryResult ['MyFieldname']

ใช่มันอาจขี้เกียจ แต่ฉันไม่เคยมีปัญหาใด ๆ


14
คุณเคยลองใช้สารสกัด () ฟังก์ชั่นของ PHP หรือไม่? php.net/manual/th/function.extract.php
DarkSide

1
มีประโยชน์หนึ่งซับสำหรับชุดผลลัพธ์ DB: foreach ($ row เป็น $ k => $ v) {$$ k = $ v}
กำจัด 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]. ' และค่าที่สองคือ $ comp_cat_a_arr [1] [1];


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.