จะใช้อะไรดีกว่าใน PHP, $ array [] = $ value หรือ array_push ($ array, $ value)?


113

จะมีอะไรดีไปกว่าการใช้ PHP ในการต่อท้ายสมาชิกอาร์เรย์

$array[] = $value;

หรือ

array_push($array, $value);

?

แม้ว่าคู่มือจะบอกว่าคุณควรหลีกเลี่ยงการเรียกใช้ฟังก์ชันดีกว่า แต่ฉันก็อ่าน$array[]ช้ากว่าarray_push()มาก มีคำชี้แจงหรือเกณฑ์มาตรฐานอะไรบ้าง?


2
$ myArray [] = 123; ซึ่งจะเร็วกว่าฟังก์ชัน array_push เป็นการเพิ่มค่าลงในอาร์เรย์นั้นโดยตรง ฟังก์ชันมีสแต็กแยกต่างหากสำหรับตัวแปรนั้น และอาจมีคำสั่งนั้นอยู่ในฟังก์ชันนั้น
sganesh

คำตอบ:


152

ไม่มีเกณฑ์มาตรฐาน แต่โดยส่วนตัวแล้วฉันรู้สึกว่า$array[]ดูสะอาดกว่าและการแยกเส้นขนในช่วงมิลลิวินาทีนั้นค่อนข้างไม่เกี่ยวข้องเว้นแต่คุณจะวางแผนที่จะผนวกสตริงหลายแสนเข้ากับอาร์เรย์ของคุณ

แก้ไข : เรียกใช้รหัสนี้:

$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    $array[] = $i;
}
print microtime(true) - $t;
print '<br>';
$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    array_push($array, $i);
}
print microtime(true) - $t;

วิธีแรกใช้$array[]เร็วกว่าวิธีที่สองเกือบ 50%

ผลการเปรียบเทียบบางส่วน:

Run 1
0.0054171085357666 // array_push
0.0028800964355469 // array[]

Run 2
0.0054559707641602 // array_push
0.002892017364502 // array[]

Run 3
0.0055501461029053 // array_push
0.0028610229492188 // array[]

สิ่งนี้ไม่น่าแปลกใจเนื่องจากคู่มือ PHP ระบุสิ่งนี้:

หากคุณใช้ array_push () เพื่อเพิ่มองค์ประกอบหนึ่งในอาร์เรย์ควรใช้ $ array [] = เนื่องจากวิธีดังกล่าวไม่มีค่าใช้จ่ายในการเรียกใช้ฟังก์ชัน

วิธีที่เป็นวลีฉันจะไม่แปลกใจถ้าarray_pushจะมีประสิทธิภาพมากกว่าเมื่อเพิ่มหลายค่า แก้ไข : จากความอยากรู้ได้มีการทดสอบเพิ่มเติมบางส่วนและถึงแม้จะเป็นจำนวนมากของการเพิ่มแต่ละสายจะเร็วกว่าขนาดใหญ่$array[] array_pushน่าสนใจ


ฉันแค่อยากรู้ว่าวิธีไหนเร็วที่สุดดังนั้นเมื่อถึงวันนั้นฉันจะถูกขอให้สร้างไซต์ที่มีการเข้าชมสูงฉันจะมีข้อมูลเชิงลึก ขอบคุณสำหรับคำตอบ.
alex

10
การเพิ่มประสิทธิภาพระดับจุลภาคเช่นนี้แทบไม่คุ้มกับความพยายาม หากคุณกำลังเขียนตั้งแต่เริ่มต้นให้ทำอย่างไรให้เหมาะสมที่สุดและเฉพาะในกรณีที่สร้างเพจได้ช้าเล็กน้อยให้สร้างโปรไฟล์ โอกาสที่จะลดลงจนต้องเปลี่ยนอะไรแบบนี้เพื่อเร่งความเร็วมีเพียงเล็กน้อย
Alister Bulman

4
เพื่อให้แน่ใจว่าเนื่องจากรหัสดูเหมือนจะไม่ตรงกับผลลัพธ์ฉันจึงตรวจสอบแล้วว่า$array[]เร็วกว่ามาก 300ms เทียบกับ 2000ms สำหรับการกำหนด 1M บนเครื่องของฉัน อย่างไรก็ตามการเพิ่ม 20 รายการพร้อมกันใน array_push นั้นเร็วถึง 20 $array[] =วินาที
Elle

5
@AlisterBulman Micro-optimization นั้นไม่คุ้มค่ากับความพยายามหากคุณคิดที่จะย้อนกลับไปใช้ codebase ทั้งหมดของคุณและ 'optimizing' มัน อย่างไรก็ตามหากคุณมีหลายวิธีในการทำสิ่งเดียวกันและตระหนักดีว่าวิธีหนึ่งดีกว่าวิธีอื่น (แม้เพียงเล็กน้อย) คุณสามารถทำให้เป็นนิสัยที่จะใช้วิธีนั้นได้ ทำไมคุณไม่ทำเช่นนี้?
Okonomiyaki3000

2
@AlisterBulman ฉันต้องไม่เห็นด้วยอย่างยิ่งหรืออย่างน้อยก็บางส่วนถ้าคุณรู้ดีเขียนได้ดีขึ้นแต่อย่าใช้ความพยายามมากในการค้นหาการเพิ่มประสิทธิภาพไมโครที่เป็นไปได้ ...
jave.web

42

การใช้ array_push () หลักคือคุณสามารถพุชหลายค่าไปยังส่วนท้ายของอาร์เรย์

มีระบุไว้ในเอกสารประกอบ :

หากคุณใช้ array_push () เพื่อเพิ่มองค์ประกอบหนึ่งในอาร์เรย์ควรใช้ $ array [] = เนื่องจากวิธีดังกล่าวไม่มีค่าใช้จ่ายในการเรียกใช้ฟังก์ชัน


29

จากเอกสาร php สำหรับarray_push :

หมายเหตุ: หากคุณใช้ array_push () เพื่อเพิ่มองค์ประกอบหนึ่งในอาร์เรย์ควรใช้ $ array [] = เนื่องจากวิธีดังกล่าวไม่มีค่าใช้จ่ายในการเรียกใช้ฟังก์ชัน


ตลกดีที่คำตอบของคุณเป็นอันดับแรก แต่ได้รับการโหวตน้อยกว่า
T.Woody

21

คำพูดบนท้องถนนคือ [] เร็วกว่าเนื่องจากไม่มีค่าใช้จ่ายในการเรียกฟังก์ชัน นอกจากนี้ยังไม่มีใครชอบฟังก์ชันอาร์เรย์ของ PHP ...

"มันเป็น ... กองฟางเข็ม .... หรือมันคือกองหญ้า ... อาฉ *** มัน ... [] ="


7
ฮะ? ฟังก์ชันอาร์เรย์ของ PHP นั้นยอดเยี่ยมมาก
cletus

13
ฟังก์ชั่นพวกเขายอดเยี่ยมใช่ แต่เขาอ้างถึงรูปแบบการตั้งชื่อที่ไม่สอดคล้องกัน
ryeguy

2
คุณควรเปิดการบอกใบ้พารามิเตอร์ใน IDE ของคุณ แต่ฉันเห็นด้วยความสม่ำเสมอบางอย่างน่าจะดีมาก
Pim Jager

4
ฉันเห็นด้วยกับเรื่องนี้ ไม่มีความสอดคล้องกันทั้งในรูปแบบการตั้งชื่อ (x_y หรือ xy หรือ y_x ... ) หรือในตรรกะของพารามิเตอร์(ส่งผ่านวัตถุเป้าหมายก่อนสุดท้ายระหว่างอาร์เรย์สตริงและ regexps ขอให้โชคดีที่พบกฎทั่วไป!)
e2-e4

3
FWIW ฉันชอบรูปแบบการตั้งชื่อเข็ม / หญ้าแห้งและจำได้ง่ายเนื่องจากเป็นไปในลำดับเดียวกับวลี: "like
find

8

ข้อแตกต่างอย่างหนึ่งคือคุณสามารถเรียก array_push () ที่มีพารามิเตอร์มากกว่าสองตัวกล่าวคือคุณสามารถพุชองค์ประกอบมากกว่าหนึ่งรายการไปยังอาร์เรย์

$myArray = array();
array_push($myArray, 1,2,3,4);
echo join(',', $myArray);

พิมพ์ 1,2,3,4


2

การประกาศ $ myarray [] แบบง่ายๆจะเร็วขึ้นเนื่องจากคุณเพียงแค่ดันไอเท็มไปยังสแต็กของไอเท็มเนื่องจากไม่มีค่าใช้จ่ายที่ฟังก์ชันจะนำมา


2

เนื่องจาก " array_push " เป็นฟังก์ชันและเรียกหลายครั้งเมื่ออยู่ในลูปดังนั้นจึงจะจัดสรรหน่วยความจำลงในสแต็ก แต่เมื่อเราใช้ $ array [] = $ value เราก็แค่กำหนดค่าให้กับ array


1

อันที่สองคือการเรียกใช้ฟังก์ชันดังนั้นโดยทั่วไปควรจะช้ากว่าการใช้คุณสมบัติการเข้าถึงอาร์เรย์หลัก แต่ผมคิดว่าแม้การสืบค้นฐานข้อมูลหนึ่งที่อยู่ในสคริปต์ของคุณจะ outweight 1.000.000 array_push()โทรไป


0

แม้ว่าคำถามจะมากกว่าเกี่ยวกับประสิทธิภาพ แต่ผู้คนก็จะสงสัยในคำถามนี้ว่าควรใช้array_pushหรือ$arr[]ไม่

ฟังก์ชันอาจหมายถึงบรรทัดที่น้อยกว่าสำหรับหลายค่า:

// 1 line:
array_push($arr, "Bob", "Steve");
// versus 2 lines:
$arr[] = "Bob";
$arr[] = "Steve";

อย่างไรก็ตาม , array_push...

  • ไม่สามารถรับคีย์อาร์เรย์ได้
  • ทำลายหลักการตั้งชื่อเข็ม / กองหญ้า
  • ช้ากว่าดังที่ได้กล่าวไปแล้ว

$arr[]ฉันจะติดกับ


0

ฉันไม่อยากเพิ่ม: int array_push(...)ส่งคืนจำนวนองค์ประกอบใหม่ในอาร์เรย์ ( php doc ) $myArray[] = ...; $total = count($myArray);ซึ่งจะเป็นประโยชน์และมีขนาดกะทัดรัดมากกว่า

นอกจากนี้ยังarray_push(...)มีความหมายเมื่อใช้ตัวแปรเป็นสแต็ก

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