ความแตกต่างระหว่าง array_push () และ $ array [] =


117

ในคู่มือ PHP ( array_push ) ระบุว่า ..

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

ตัวอย่างเช่น :

$arr = array();
array_push($arr, "stackoverflow");
print_r($arr);

VS

$arr[] = "stackoverflow";
print_r($arr);

ฉันไม่เข้าใจว่าทำไมถึงมีความแตกต่างกันมาก


8
หนึ่งคือการเรียกใช้ฟังก์ชันอีกสายหนึ่งไม่ใช่ สิ่งที่ระบุไว้ในกล่อง
KingCrunch

1
หนึ่งคือการเรียกใช้ฟังก์ชันตามที่กล่าวไว้ข้างต้นซึ่งหมายถึงการใช้ทรัพยากรบางอย่างเพื่อสลับการควบคุมไปยัง / จากการเรียกฟังก์ชัน (ส่งผลให้เกิดการประมวลผลค่าโสหุ้ย) ในขณะที่ในภายหลังเป็นเพียงการกำหนดองค์ประกอบใหม่ลงในอาร์เรย์ทันที
Ghazanfar Mir

2
คำถามนี้ช่วยให้ฉันประหยัดเวลาได้มากในการผลักดันอาร์เรย์ :)
RozzA

คำตอบ:


151

เมื่อคุณเรียกใช้ฟังก์ชันใน PHP (เช่นarray_push()) จะมีค่าโสหุ้ยในการโทรเนื่องจาก PHP ต้องค้นหาการอ้างอิงฟังก์ชันค้นหาตำแหน่งในหน่วยความจำและดำเนินการตามรหัสที่กำหนด

การใช้$arr[] = 'some value';ไม่จำเป็นต้องมีการเรียกใช้ฟังก์ชันและดำเนินการเพิ่มเติมในโครงสร้างข้อมูลโดยตรง ดังนั้นเมื่อเพิ่มข้อมูลจำนวนมากจึงเป็นการใช้ทรัพยากรอย่างรวดเร็วและมีประสิทธิภาพ$arr[]มากขึ้น


3
จะเป็นอย่างไรถ้าสัญกรณ์ดังกล่าว "$ arr [] = 'some value';" เดือดถึงการเรียกใช้ฟังก์ชัน?
Tebe

1
@gekannt ว่าจะเกิดขึ้นได้อย่างไร? คุณหมายถึงว่า 'ค่านิยมบางอย่าง' ในความคิดเห็นของคุณเป็นการปิดหรือไม่? นั่นจะจัดเก็บข้อมูลอ้างอิงของการปิดในอาร์เรย์ หากคุณหมายความว่า 'ค่าบางค่า' เป็นฟังก์ชันที่เรียกใช้ฟังก์ชันนั้นจะเพิ่มสิ่งที่ส่งคืนฟังก์ชัน
Kirkland

@ Kirkland Operators เป็นเพียงฟังก์ชันที่มีไวยากรณ์ทางเลือกในภาษาที่คล้าย C ส่วนใหญ่ฉันไม่ใช่ผู้เชี่ยวชาญด้าน PHP แต่ฉันสามารถจินตนาการได้ว่าพวกเขาใช้ตัวดำเนินการในลักษณะเดียวกันเนื่องจากเป็นภาษา C
Kevin

1
@Kevin: คุณเห็นด้วยกับคุณและฉันค่อนข้างแน่ใจว่ามีฟังก์ชันที่อยู่เบื้องหลังไวยากรณ์ทางเลือกไม่ใช่ฟังก์ชันที่กล่าวถึงข้างต้นเนื่องจากฉันเห็นความคิดเห็นที่ผิดพลาดในเอกสาร php: "หากคุณใช้ array_push () เพื่อเพิ่มองค์ประกอบหนึ่ง สำหรับอาร์เรย์ควรใช้ $ array [] = เพราะด้วยวิธีนี้จะไม่มีค่าใช้จ่ายในการเรียกใช้ฟังก์ชัน " ตอนนี้ไม่มีเวลาดูว่าอะไรอยู่เบื้องหลังเนื่องจากข้อความค้นหาค่อนข้างสับสนสำหรับเครื่องมือค้นหา :)
jnhghy - Alexandru Jantea

มีหลักฐานจริงที่$arr[] = valueเร็วกว่านี้หรือไม่? พยายามนึกว่าทำไมคอมไพเลอร์ถึงปฏิบัติกับโค้ดแตกต่างกันไป
ค ..

44

คุณสามารถเพิ่มมากกว่า 1 องค์ประกอบในหนึ่งช็อตไปยังอาร์เรย์โดยใช้ array_push

เช่น array_push($array_name, $element1, $element2,...)

โดยที่ $ element1, $ element2, ... คือองค์ประกอบที่จะเพิ่มลงในอาร์เรย์

แต่ถ้าคุณต้องการเพิ่มเพียงองค์ประกอบเดียวในครั้งเดียวควรใช้วิธีอื่น (เช่นการใช้ $ array_name [])


เป็นการปฏิบัติที่ไม่ดีในการรวมทั้งสองอย่างตามความจำเป็นตลอดทั้งโครงการ
PBwebD

1
@ testing123 ไม่ได้อย่างแน่นอน เป็นแนวทางปฏิบัติที่ดีในการใช้โซลูชันที่มีประสิทธิภาพสูงสุดที่มีอยู่ในมือเว้นแต่จะทำให้ความสามารถในการอ่านง่ายเข้ากันได้ ฯลฯ (หรือหากคุณจำเป็นต้องปฏิบัติตามคำแนะนำสไตล์บางอย่าง)
Chris Kraszewski

15

ความแตกต่างอยู่ในบรรทัดด้านล่างถึง "เพราะด้วยวิธีนี้จะไม่มีค่าใช้จ่ายในการเรียกใช้ฟังก์ชัน"

array_push()จะขึ้นคำเตือนหากอาร์กิวเมนต์แรกไม่ใช่อาร์เรย์ สิ่งนี้แตกต่างจาก$var[]ลักษณะการทำงานที่สร้างอาร์เรย์ใหม่


4
ฉันไม่ได้บอกว่ามันเป็นเหตุผล ในคำถามมีการถามความแตกต่างและนี่ก็คือความแตกต่างด้วย
Baig

7

คุณควรใช้$array[]ถ้าเป็นไปได้เสมอเพราะตามที่ระบุในกล่องจะไม่มีค่าใช้จ่ายสำหรับการเรียกฟังก์ชัน ดังนั้นจึงเร็วกว่าการเรียกใช้ฟังก์ชันเล็กน้อย


4

array_push - พุชองค์ประกอบอย่างน้อยหนึ่งองค์ประกอบไปยังส่วนท้ายของอาร์เรย์

จดคำว่า " องค์ประกอบอย่างน้อยหนึ่งองค์ประกอบไว้ที่ส่วนท้าย " เพื่อทำเช่นนั้น$arr[]คุณจะต้องได้รับขนาดสูงสุดของอาร์เรย์


เรื่อง"ที่จะทำโดยใช้ข้อมูล $ arr [] คุณจะต้องได้รับขนาดสูงสุดของอาร์เรย์" ไม่มีคุณมีความสับสนกับสิ่งที่จะถูกกล่าวถึงที่นี่ซึ่งเป็น$arr[...index...] = $value; $arr[] = $value;ไม่จำเป็นต้องรู้ขนาดหรืออาร์เรย์เพื่อดันส่วนท้าย องค์ประกอบหลายอย่างจะเป็นการโทรหลายครั้ง: $arr[] = $value1; $arr[] = $value2; $arr[] = $value3;
ToolmakerSteve

2

อธิบาย: 1. อันแรกประกาศตัวแปรในอาร์เรย์

2. เมธอด array_push ที่สองใช้เพื่อดันสตริงในตัวแปรอาร์เรย์

3. ในที่สุดก็จะพิมพ์ผลลัพธ์

4. วิธีที่สองคือเก็บสตริงในอาร์เรย์โดยตรง

5. ข้อมูลถูกพิมพ์ในค่าอาร์เรย์โดยใช้เมธอด print_r

สองคนนี้เหมือนกัน


1

ทั้งสองเหมือนกัน แต่ array_push สร้างลูปในพารามิเตอร์ซึ่งเป็นอาร์เรย์และดำเนินการ $ array [] = $ element


0

ฉันรู้ว่านี่เป็นคำตอบเก่า ๆ แต่อาจเป็นประโยชน์สำหรับคนอื่นที่รู้ว่าความแตกต่างระหว่างสองอย่างนี้ก็คือถ้าคุณต้องเพิ่มมากกว่า 2/3 ค่าต่อลูปในอาร์เรย์การใช้งานจะเร็วกว่า:

     for($i = 0; $i < 10; $i++){
          array_push($arr, $i, $i*2, $i*3, $i*4, ...)
     }

แทน:

     for($i = 0; $i < 10; $i++){
         $arr[] = $i;
         $arr[] = $i*2;
         $arr[] = $i*3;
         $arr[] = $i*4;
         ...
     }

แก้ไข - ลืมปิดวงเล็บสำหรับforเงื่อนไข


1
ฉันสงสัยว่าสิ่งนี้เปรียบเทียบกับ array_merge อย่างไร เช่นfor(...){ $arr = $arr + [$i, $i*2, $i*3, $i*4, ...] }. ฉันคาดเดา array_push ยังเร็วกว่านั้นเล็กน้อย
ToolmakerSteve

0

ไม่มีใครพูด แต่ array_push ดันเฉพาะองค์ประกอบไปที่ END OF THE ARRAY โดยที่ $ array [index] สามารถแทรกค่าที่ดัชนีใดก็ได้ ความแตกต่างใหญ่


คำถามคือ "ความแตกต่างระหว่าง array_push () และ $ array [] =" สิ่งที่ฉันพูดคือความแตกต่างอย่างหนึ่ง ใหญ่!
Marco

1
ฉันไม่เห็นด้วยอย่างเคารพ คุณจะอธิบาย$array[index] = ซึ่งเป็นการดำเนินงานที่แตกต่างกัน$array[] = ...มากกว่า คำถามจะให้รหัสสองส่วนและถามว่าเหตุใดจึงมี[ประสิทธิภาพ] ที่แตกต่างกันอย่างมีนัยสำคัญระหว่างรหัสเหล่านี้ คำถามหมายถึงตามตัวอักษร$array[] = ...ซึ่งเป็นสำนวน php เฉพาะที่ไม่เกี่ยวข้องกับดัชนี ดัชนี array + แก้ปัญหาที่แตกต่างกันให้รหัสที่แตกต่างกันและเป็นการแลกเปลี่ยนที่แตกต่างกัน
ToolmakerSteve
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.