รับองค์ประกอบแรกของอาร์เรย์


1071

ฉันมีอาเรย์:

array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )

ฉันต้องการรับองค์ประกอบแรกของอาร์เรย์นี้ ผลลัพธ์ที่คาดหวัง: สตริง apple

ข้อกำหนดหนึ่งข้อ: ไม่สามารถทำได้โดยผ่านการอ้างอิงดังนั้นจึงarray_shiftไม่ใช่ทางออกที่ดี

ฉันจะทำสิ่งนี้ได้อย่างไร


1
คุณหมายถึงอะไรอ้างอิงไม่ได้?
cjk

ฟังก์ชั่นไม่ควรทำงานโดยใช้&$arrayเป็นพารามิเตอร์
hsz

4
ฉันสงสัยว่าสิ่งที่คุณ "จริง ๆ " หมายถึงโดย "ไม่สามารถทำได้โดยการอ้างอิง" คืออาร์เรย์ของคุณจะถูกส่งกลับแบบไดนามิกจากฐานข้อมูลและคุณไม่ต้องการที่จะผ่านอาร์เรย์เป็นตัวแปรก่อนที่จะรับองค์ประกอบแรก จากมัน. หากฉันพูดถูกแล้วการแก้ปัญหาส่วนใหญ่ทั้งหมดที่ให้ไว้ด้านล่าง (รวมถึงคำตอบที่ยอมรับ) นั้นไม่เพียงพอ
cartbeforehorse

คุณเพียงแค่ต้องได้รับมันหรือรับมันและลบมันออกจากอาร์เรย์ที่มีอยู่?
Jo Smo

สำหรับการใช้งาน Arrays ขั้นพื้นฐานคุณสามารถตรวจสอบได้ที่ลิงค์technofusions.com/introduction-to-arrays-in-php
Vikrant Vir Bhalla

คำตอบ:


1367

คำตอบเดิม แต่มีราคาแพง (O (n)):

array_shift(array_values($array));

ใน O (1):

array_pop(array_reverse($array));

กรณีการใช้งานอื่น ๆ ฯลฯ ...

หากการแก้ไข (ในความหมายของการรีเซ็ตตัวชี้อาร์เรย์) $arrayไม่ใช่ปัญหาคุณอาจใช้:

reset($array);

สิ่งนี้ควรมีประสิทธิภาพมากกว่าในทางทฤษฎีหากจำเป็นต้องใช้อาร์เรย์ "คัดลอก":

array_shift(array_slice($array, 0, 1));

ด้วย PHP 5.4+ (แต่อาจทำให้เกิดข้อผิดพลาดดัชนีถ้าว่าง):

array_values($array)[0];

77
+1 สำหรับวิธีแก้ปัญหาที่ชาญฉลาดเพื่อป้องกันการแก้ไขอาเรย์ดั้งเดิมด้วย array_values ​​()
ChrisR

44
ฉันได้รับสิ่งนี้: <b> มาตรฐานที่เข้มงวด </b>: ควรส่งผ่านตัวแปรโดยการอ้างอิงเท่านั้น วิธีแก้ปัญหาที่ดี btw
Simone

191
นี่มันเกินความจริงไปหน่อยเหรอ? จะเกิดอะไรขึ้นถ้าอาร์เรย์มีองค์ประกอบหลายพันรายการ มันเป็นธรรมที่จะสร้างอาร์เรย์ใหม่ทั้งหมดเพียงเพื่อรับองค์ประกอบแรกหรือไม่ list()และreset()เป็นโซลูชั่นที่ดีกว่ามากสำหรับความคิดเห็นของฉัน
Martin Dimitrov

33
ฉันเห็นด้วย. overkill รวมและทรัพยากรพิเศษหนักเมื่อเปรียบเทียบกับหนึ่งบรรทัดที่รีเซ็ตและส่งคืนค่าปัจจุบัน: reset ($ array);
zmonteca

48
-1 ดังที่ผู้แสดงความเห็นได้กล่าวไว้ข้างต้น มันทำให้ฉันงุนงงว่ามันมี 101 upvotes
การแข่งขัน Lightness ใน Orbit

789

ดังที่ไมค์ชี้ให้เห็น (วิธีที่ง่ายที่สุด):

$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
echo reset($arr); // Echoes "apple"

หากคุณต้องการรับคีย์: (ดำเนินการได้หลังจากรีเซ็ต)

echo key($arr); // Echoes "4"

จากเอกสารของ PHP :

รีเซ็ตแบบผสม (อาร์เรย์& $ อาร์เรย์ );

รายละเอียด:

รีเซ็ต ()ย้อนกลับตัวชี้ภายในของอาร์เรย์ไปยังองค์ประกอบแรกและส่งกลับค่าขององค์ประกอบอาร์เรย์แรกหรือเป็นเท็จถ้าอาร์เรย์ว่างเปล่า


แม้ว่าจะถูกส่งผ่านโดยการอ้างอิงเพื่อรีเซ็ตอาร์เรย์ดั้งเดิมจะไม่ถูกแก้ไข ฉันเดาว่านั่นเป็นเหตุผลที่ hsz ไม่ต้องการส่งต่อโดยการอ้างอิง .. ?
Dennis Jamin

10
ตัววนซ้ำของอาร์เรย์ถูกแก้ไข หากคุณทำสิ่งนี้foreachด้วยa array เรื่องคุณจะพลาดมัน
Zenexer

2
@ Zenexer สิ่งนี้ไม่เป็นความจริงเสมอไป โดยปกติแล้วในทางปฏิบัติforeachจะคัดลอกอาร์เรย์ที่วนซ้ำ
ลุคลูกพี่ลูกน้อง

1
@Angger หลังจากรีเซ็ตคุณสามารถโทรkey($arr)และคุณจะได้รับ '4' (เพิ่มเข้าไปในคำตอบ)
Lepe

3
@Zenexer และ Luke Cousins ​​ไม่ถูกต้อง: 1) foreach ไม่ได้ใช้ตัวชี้ internat ของอาร์เรย์ - แต่มันจะสร้างตัวชี้ของมันเอง มันเป็นเรื่องง่ายที่จะตรวจสอบการเรียก foreach ภายในรีเซ็ต - reset()ห่วงจะเป็นไปตามทางของมันไม่มีผลกระทบจาก 2) ไม่ foreach ไม่สร้างสำเนาของอาร์เรย์ !!! มันสร้างเพียงตัวชี้ของมันเอง (ไม่ใช่แม้แต่สำเนาของที่มีอยู่ - มันยังง่ายต่อการตรวจสอบเรียกnext()ก่อน foreach)
dmikam

278
$first_value = reset($array); // First element's value
$first_key = key($array); // First element's key

2
ฉันไม่ได้ทดสอบจริง ๆ แต่ดูเหมือนว่าวิธีนี้จะมีประสิทธิภาพมากที่สุด
mason81

4
ปัญหาเดียวคือคำถามที่ถามถึงค่าไม่ใช่กุญแจ ดังนั้นปัจจุบัน ($ array) ควรใช้แทน key ($ array)
zmonteca

4
@zmonteca $ first_value = รีเซ็ต ($ array); ที่นี่คุณจะได้รับค่ารีเซ็ต () ฟังก์ชั่นย้อนกลับอาร์เรย์ตัวชี้ภายในและส่งกลับองค์ประกอบแรก
S3Mi

1
คำตอบที่ดีที่สุด! กำลังมองหาคีย์ () ที่เทียบเท่าเพื่อรับค่าแรก สิ่งนี้ช่วยได้!
Alain Tiemblo

98
$arr = array( 9 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // echoes 'apple'

หากคุณไม่ต้องการสูญเสียตำแหน่งตัวชี้ปัจจุบันเพียงสร้างนามแฝงสำหรับอาร์เรย์


1
ไม่เข้าใจคุณหมายถึงอะไร ใช้งานได้ดีไม่ว่ากุญแจดอกแรกจะใหญ่กว่ากุญแจดอกแรก
yoda

29
+1 FYI reset()แล้วส่งคืนองค์ประกอบแรกดังนั้นจึงไม่จำเป็นต้องใช้current()- echo reset($arr)ควรพอเพียง
Mike

@ ไมค์ แต่คุณอาจต้องการcurrentที่จะresetเพื่อหลีกเลี่ยงการแจ้งให้ทราบล่วงหน้า PHP / ข้อผิดพลาดที่เกิดขึ้นในกรณีที่การอ้างอิงเช่นcurrent(array_filter(...));ใน 3v4l
CPHPython

91

current($array)คุณจะได้รับองค์ประกอบแรกของอาร์เรย์ตามคู่มือของ PHP

ทุกอาร์เรย์มีตัวชี้ภายในไปยังองค์ประกอบ "ปัจจุบัน" ของมันซึ่งจะเริ่มต้นองค์ประกอบที่แทรกเข้าไปในอาร์เรย์

ดังนั้นมันจะทำงานจนกว่าคุณจะได้ตำแหน่งตัวชี้อาร์เรย์อีกครั้งและมิฉะนั้นคุณจะต้องรีเซ็ตอาร์เรย์


4
ฉันไม่รู้ว่าทำไมนี่ไม่ใช่คำตอบที่ยอมรับเพราะมันตอบคำถามได้อย่างถูกต้องและเรียบง่าย
relipse

26
current($array)จะใช้งานได้หากตัวชี้อาร์เรย์เป็น "ปัจจุบัน" ที่ชี้ไปยังองค์ประกอบแรกมิฉะนั้นreset($array)จะต้องใช้
Jon

6
ดูเหมือนว่าcurrent()ไม่ต้องการการอ้างอิงอีกต่อไปแม้ว่าเอกสาร PHP จะไม่สะท้อนสิ่งนี้ ดังนั้นฉันคิดว่านี่เป็นทางออกที่ดีที่สุด
Ryan

@Ryan เห็นด้วย แต่วิธีนี้ได้รับ 2 ปีก่อนถึงปี 2014 ในคำตอบอื่น ๆ ของหัวข้อเดียวกันนี้ ... แปลกที่ประโยคที่ไม่สมบูรณ์นี้มีผู้โหวตมากขึ้น
CPHPython

70

คุณสามารถรับองค์ประกอบ Nth ด้วยโครงสร้างภาษา "list":

// First item
list($firstItem) = $yourArray;

// First item from an array that is returned from a function
list($firstItem) = functionThatReturnsArray();

// Second item
list( , $secondItem) = $yourArray;

ด้วยarray_keysฟังก์ชั่นที่คุณสามารถทำได้เช่นเดียวกันสำหรับปุ่ม:

list($firstKey) = array_keys($yourArray);
list(, $secondKey) = array_keys($yourArray);

2
นี่คือสิ่งที่ฉันทำ: list($first_value) = $my_array;ในความคิดของฉันตัวเลือกที่ดีที่สุด มันไม่ได้มีปัญหาจากคำตอบอื่น ๆ ที่นำเสนอที่นี่: ไม่มี "overkill" เพราะมันไม่ได้คัดลอกหรืออาร์เรย์หรือสร้างใหม่ ไม่มี "การอ้างอิง": อาร์เรย์จะไม่ถูกแก้ไข ไม่มีการ "ตั้งค่า": การเปลี่ยนแปลงตัวชี้ภายในอาร์เรย์ไม่ ...
เจ Bruni

6
โซลูชันที่หรูหรามาก แต่จะส่ง E_NOTICE เมื่ออาเรย์นั้นว่างเปล่า
Tgr

1
@ ไมค์ใช่ แต่แล้วมันไม่สง่างามอีกต่อไปดังนั้น :)
Tgr

13
ไม่ผิดหรอกเหรอ! มันทำงานได้ก็ต่อเมื่อมีคีย์อาเรintย์ลองทำlist($firstItem) = array('key1' => 'value1');แล้วคุณจะได้รับข้อผิดพลาดNotice: Undefined offset: 0
Marco Demaio

12
ชี้แจง: เทียบเท่ากับlist($x) = foo(); $x = foo()[0];โปรดทราบว่านี่ไม่จำเป็นต้องเหมือนกับ "รับไอเท็มแรก" เนื่องจากแม้แต่อาเรย์ที่ทำดัชนีจำนวนเต็มอาจไม่มีองค์ประกอบที่มีคีย์ 0 ในกรณีของฉันฉันกำลังทำ "list ($ order) = get_order ($ user) ;" แต่ "get_order" กำลังส่งคืนคำสั่งซื้อที่ระบุโดย ID ของพวกเขาซึ่งโดยทั่วไปไม่ใช่ 0 ดังที่ @Sergiy พูดว่า array_values ​​() จะแก้ไขสิ่งนี้ แต่จะเบี่ยงเบนจากประสิทธิภาพและ (สำคัญกว่า) การอ่านรหัส
Warbo

55

PHP 5.4+:

array_values($array)[0];

นี่คือสำหรับคนที่เจ๋งที่สุดที่ทำงานล่าสุดและยิ่งใหญ่ที่สุด ;)
Zenexer

1
เขาแก้ไขคำตอบของเขาในเดือนตุลาคม 2013 เพื่อรวมคำตอบของฉันที่ฉันเพิ่มในเดือนเมษายน
Samer Ata

PHP 4:$array_values = array_values($array); $value = $array_values[0];
zdick

38

PHP 7.3เพิ่มสองฟังก์ชั่นในการรับคีย์แรกและคีย์สุดท้ายของอาเรย์โดยตรงโดยไม่ต้องดัดแปลงอาเรย์ดั้งเดิมและไม่สร้างวัตถุชั่วคราวใด ๆ :

นอกเหนือจากความหมายในเชิงความหมายแล้วฟังก์ชันเหล่านี้ยังไม่ย้ายตัวชี้อาร์เรย์ (เช่นเดียวกับที่foreachทำ)

มีกุญแจหนึ่งสามารถรับค่าโดยกุญแจโดยตรง


ตัวอย่าง (ทั้งหมดนี้ต้องการ PHP 7.3+)

รับคีย์แรก / คีย์สุดท้ายและค่า:

$my_array = ['IT', 'rules', 'the', 'world'];

$first_key = array_key_first($my_array);
$first_value = $my_array[$first_key];

$last_key = array_key_last($my_array);
$last_value = $my_array[$last_key];

รับค่าแรก / สุดท้ายเป็นหนึ่งในตอร์ปิโดสมมติว่าอาร์เรย์ต้องไม่ว่างเปล่า :

$first_value = $my_array[ array_key_first($my_array) ];

$last_value = $my_array[ array_key_last($my_array) ];

รับค่าแรก / สุดท้ายเป็นหนึ่งใน liners โดยมีค่าเริ่มต้นสำหรับอาร์เรย์ที่ว่างเปล่า:

$first_value = empty($my_array) ? 'default' : $my_array[ array_key_first($my_array) ];

$last_value = empty($my_array) ? 'default' : $my_array[ array_key_last($my_array) ];

ย่อด้วยตัวดำเนินการที่เป็นโมฆะแบบรวมศูนย์โดยปกติจะเป็นค่าเริ่มต้นดังนั้น: $first_value = $my_array[array_key_first($my_array)] ?? null;
Mitchell McKenna

29

สมมติ:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

เพียงใช้:

$array[key($array)]

เพื่อรับองค์ประกอบแรกหรือ

key($array)

เพื่อรับรหัสแรก

หรือคุณสามารถยกเลิกการเชื่อมโยงก่อนหากคุณต้องการลบ


9
currentทำไมไม่ใช้อย่างนั้นเหรอ?
Marco Demaio

27

อาร์เรย์บางคนไม่ได้ทำงานร่วมกับฟังก์ชั่นชอบlist, หรือreset currentบางทีพวกเขาอาจจะเป็น "มารยาท" - ใช้ ArrayIterator เป็นบางส่วน

หากคุณต้องการดึงค่าแรกโดยไม่คำนึงถึงอาร์เรย์คุณสามารถลัดวงจรตัววนซ้ำได้:

foreach($array_with_unknown_keys as $value) break;

ค่าของคุณจะพร้อมใช้งานใน $valueและลูปจะแตกหลังจากวนซ้ำครั้งแรก สิ่งนี้มีประสิทธิภาพมากกว่าการคัดลอกอาเรย์ขนาดใหญ่ที่อาจเกิดขึ้นไปยังฟังก์ชันเช่น array_unshift (array_values ​​($ arr))

คุณสามารถคว้ากุญแจด้วยวิธีนี้เช่นกัน:

foreach($array_with_unknown_keys as $key=>$value) break;

หากคุณกำลังเรียกสิ่งนี้จากฟังก์ชั่นเพียงแค่คืนต้น:

function grab_first($arr) {
    foreach($arr as $value) return $value;
}

ฉันคิดว่านี่เป็นหนึ่งในวิธีที่เร็วที่สุดเนื่องจากการใช้ภาษาสร้างก่อนแทนที่จะเรียกใช้ฟังก์ชัน (ซึ่งมีราคาแพงกว่า) designcise.com/web/tutorial/…
Ildar Amankulov

19

จากผู้ช่วยของ Laravel :

function head($array)
{
    return reset($array);
}

อาร์เรย์ที่ถูกส่งผ่านตามค่าไปยังฟังก์ชันการรีเซ็ต ()มีผลกับตัวชี้ภายในของสำเนาของอาร์เรย์และจะไม่แตะอาร์เรย์เดิม (สังเกตว่าจะส่งคืนfalseถ้าอาร์เรย์ว่างเปล่า)

ตัวอย่างการใช้งาน:

$data = ['foo', 'bar', 'baz'];

current($data); // foo
next($data); // bar
head($data); // foo
next($data); // baz

นอกจากนี้ที่นี่เป็นทางเลือก มันเร็วกว่าเล็กน้อยแต่น่าสนใจกว่า มันช่วยให้เปลี่ยนค่าเริ่มต้นได้อย่างง่ายดายถ้าอาร์เรย์ว่างเปล่า:

function head($array, $default = null)
{
    foreach ($array as $item) {
        return $item;
    }
    return $default;
}

สำหรับบันทึกนี่คือคำตอบของฉันสำหรับองค์ประกอบสุดท้ายของอาร์เรย์


17

เรียบง่ายแบบนี้! มีคำตอบที่ถูกต้องมากมายที่นี่ แต่เพื่อลดความสับสนให้น้อยที่สุดทั้งสองนี้ทำงานและลดค่าใช้จ่ายจำนวนมาก:

key($array)รับคีย์แรกของอาร์เรย์
current($array)รับค่าแรกของอาร์เรย์


แก้ไข:
เกี่ยวกับความคิดเห็นด้านล่าง ตัวอย่างต่อไปนี้จะแสดงผล:string(13) "PHP code test"

$array = array
(
   '1'           => 'PHP code test',  
   'foo'         => 'bar', 5 , 5 => 89009, 
   'case'        => 'Random Stuff: '.rand(100,999),
   'PHP Version' => phpversion(),
   0             => 'ending text here'
);

var_dump(current($array));

11
เอ่อ currentเท่ากับองค์ประกอบปัจจุบัน คุณต้องรีเซ็ตตัวชี้ไปยังจุดเริ่มต้นของอาร์เรย์เพื่อให้แน่ใจว่าเป็นจุดเริ่มต้นจริง
Waterloomatt

ปัจจุบัน () จะได้รับองค์ประกอบปัจจุบันไม่ใช่องค์ประกอบแรก มันแตกต่าง.
Amirhossein Tarmast

ปัจจุบันจะทำงานหากมีเพียงองค์ประกอบเดียวในอาร์เรย์
Zameer Fouzan


14

echo current($array)ฉันจะทำ


1
@hsz ไม่สำคัญcurrent()ไม่ผิดพลาดเมื่อไม่มีการอ้างอิงถึง โดยมีเงื่อนไขว่าตัวชี้ยังคงอยู่ที่จุดเริ่มต้นการทำงานนี้
Dan Lugg

แต่มันสร้างประกาศซึ่งทำให้บันทึกของคุณสกปรกและดี ... คุณควรกำจัดประกาศยังถ้าพวกเขาไม่สำคัญ
dmikam

1
@dmikam ไม่มีมันไม่ได้ ที่จริงresetผลิต "ตัวแปรเฉพาะควรจะผ่านอ้างอิง" แจ้งให้ทราบล่วงหน้าในขณะที่currentไม่ได้: ตัวอย่างออนไลน์ PHP current(array_filter(...));บรรณาธิการของ
CPHPython

@ CPHPython ดูเหมือนว่าคุณพูดถูก ... ดูเหมือนว่าฉันมีความคิดที่เป็นปัจจุบันจาก PHP 4 ที่เก่าซึ่งทำให้เกิดข้อผิดพลาดร้ายแรง: sandbox.onlinephpfunctions.com/code/ ...... ปัญหาเดียวที่ฉันเห็นในการใช้กระแสคือ ไม่รับประกันว่าองค์ประกอบที่ส่งคืนเป็นองค์ประกอบแรกของอาร์เรย์ (ตัวชี้ภายในอาจถูกแก้ไขโดยฟังก์ชันที่เรียกว่า) ความจริงมันอาจส่งคืนองค์ประกอบแบบสุ่มของอาร์เรย์
dmikam

1
@CPHPython บิตตัวอย่างเทียม แต่มันก็แสดงให้เห็นถึงความคิดของฉันดี: sandbox.onlinephpfunctions.com/code/... เพียงแค่คิดว่าคุณได้รับอาร์เรย์ของคุณจากฟังก์ชั่นบางอย่างที่ใช้next(), end()หรือฟังก์ชั่นอื่น ๆ ที่ปรับเปลี่ยนอาร์เรย์ของตัวชี้ภายใน ในตัวอย่างของฉันcurrent()คืนค่า null เนื่องจากตัวชี้ภายในคือ "นอกช่วง" ของอาร์เรย์ แต่อาจชี้ไปที่องค์ประกอบใด / สุ่มด้วยเช่นกัน
dmikam


10
$myArray = array (4 => 'apple', 7 => 'orange', 13 => 'plum');
$arrayKeys = array_keys($myArray);

// The first element of your array is:
echo $myArray[$arrayKeys[0]];

ฉันไม่ได้ไปตามที่อธิบายไว้ในคำตอบที่ยอมรับ ใช้ขอขอบคุณ
JayKandari

9
$array=array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

$firstValue = each($array)[1];

มันมีประสิทธิภาพมากกว่าarray_values()เพราะeach()ฟังก์ชั่นไม่ได้คัดลอกอาร์เรย์ทั้งหมด

สำหรับข้อมูลเพิ่มเติมโปรดดูที่http://www.php.net/manual/en/function.each.php


because the each() function does not copy the entire array.+1

2
แต่สิ่งคือคุณควรทำการรีเซ็ตก่อนถ้าตัวชี้ภายในไม่อยู่ที่จุดเริ่มต้นคุณจะไม่ได้รับองค์ประกอบแรก
Carlos Goce

แต่แต่ละคน () จะได้รับอาร์เรย์โดยการอ้างอิงและข้อกำหนดของคำถามเริ่มต้นจะไม่ทำเช่นนั้น
dmikam

8

วิธี kludgy คือ:

$foo = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

function get_first ($foo) {
    foreach ($foo as $k=>$v){
        return $v;
    }
}

print get_first($foo);

3
อย่างน้อยคุณก็ซื่อสัตย์ - เป็นคนขี้ขลาด! แต่มันใช้งานได้และฉันเคยใช้มาก่อนในการเรียนรู้เทคนิค list () ด้านบน
random_user_name

1
หากคุณกำลังทำสิ่งนี้คุณอาจใช้เช่นกันreset()เนื่องจากตัวชี้อาร์เรย์ถูกรีเซ็ตก่อนที่จะforeachถูกเรียกใช้ต่อไป
Tyzoid


7

งานเหล่านี้ส่วนใหญ่! แต่สำหรับการโทรด่วนบรรทัดเดียว (ทรัพยากรต่ำ):

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo $array[key($array)];

// key($array) -> will return the first key (which is 4 in this example)

แม้ว่าจะใช้งานได้ดีและเหมาะสมดีโปรดดูคำตอบเพิ่มเติมของฉัน: https://stackoverflow.com/a/48410351/1804013


5
นี่เทียบเท่ากับการใช้current($array)ซึ่งต้องการให้ตัวชี้ภายในของอาร์เรย์เป็นองค์ประกอบแรกอย่างไรก็ตามในกรณีecho reset($array)นี้เหมาะสมที่สุด
Tyzoid

@Tyzoid เขาเขียนคำตอบของคุณอีกครั้งที่นี่พร้อมกับคำแนะนำของคุณแต่เขาละเว้นคำอธิบายของคุณ ... ขอบคุณ
CPHPython

@Tyzoid: ฉันได้ทำคำตอบเพิ่มเติม / อัปเดตไปสักครู่: stackoverflow.com/a/48410351/1804013
tfont

5

ฉันคิดว่าการใช้array_valuesจะเป็นทางออกที่ดีที่สุดของคุณที่นี่ คุณสามารถคืนค่าที่ศูนย์ดัชนีจากผลลัพธ์ของฟังก์ชันนั้นเพื่อรับ 'apple'


5

นี่มันช้าไปหน่อยสำหรับเกม แต่ฉันได้พบกับปัญหาที่อาเรย์ของฉันมีองค์ประกอบอาเรย์เป็นเด็กอยู่ข้างในและดังนั้นฉันจึงไม่สามารถรับการแทนค่าสตริงขององค์ประกอบอาเรย์แรกได้ ด้วยการใช้current()ฟังก์ชั่นของ PHPฉันจัดการสิ่งนี้:

<?php
    $original = array(4 => array('one', 'two'), 7 => array('three', 'four'));
    reset($original);  // to reset the internal array pointer...
    $first_element = current($original);  // get the current element...
?>

ต้องขอบคุณการแก้ปัญหาในปัจจุบันทั้งหมดที่ช่วยให้ฉันได้รับคำตอบนี้ฉันหวังว่าสิ่งนี้จะช่วยให้ใครซักคนในบางครั้ง!


4

ใช้:

$first = array_slice($array, 0, 1);  
$val= $first[0];

ตามค่าเริ่มต้นarray_sliceจะไม่เก็บรักษาคีย์ดังนั้นเราจึงสามารถใช้ศูนย์เป็นดัชนีได้อย่างปลอดภัย


4

โซลูชันสองอย่างสำหรับคุณ

โซลูชันที่ 1 - ใช้คีย์ คุณยังไม่ได้บอกว่าคุณไม่สามารถใช้งานได้ :)

<?php
    // Get the first element of this array.
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Gets the first element by key
    $result = $array[4];

    // Expected result: string apple
    assert('$result === "apple" /* Expected result: string apple. */');
?>

โซลูชันที่ 2 - array_flip () + แป้น ()

<?php
    // Get first element of this array. Expected result: string apple
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Turn values to keys
    $array = array_flip($array);

    // You might thrown a reset in just to make sure
    // that the array pointer is at the first element.
    // Also, reset returns the first element.
    // reset($myArray);

    // Return the first key
    $firstKey = key($array);

    assert('$firstKey === "apple" /* Expected result: string apple. */');
?>

โซลูชันที่ 3 - array_keys ()

echo $array[array_keys($array)[0]];

2

นี่ไม่ใช่การตอบสนองง่ายๆในโลกแห่งความเป็นจริง สมมติว่าเรามีตัวอย่างของคำตอบที่เป็นไปได้ที่คุณสามารถหาได้ในห้องสมุดบางแห่ง

$array1 = array();
$array2 = array(1,2,3,4);
$array3 = array('hello'=>'world', 'foo'=>'bar');
$array4 = null;

var_dump('reset1', reset($array1));
var_dump('reset2', reset($array2));
var_dump('reset3', reset($array3));
var_dump('reset4', reset($array4)); // Warning

var_dump('array_shift1', array_shift($array1));
var_dump('array_shift2', array_shift($array2));
var_dump('array_shift3', array_shift($array3));
var_dump('array_shift4', array_shift($array4)); // Warning

var_dump('each1', each($array1));
var_dump('each2', each($array2));
var_dump('each3', each($array3));
var_dump('each4', each($array4)); // Warning

var_dump('array_values1', array_values($array1)[0]); // Notice
var_dump('array_values2', array_values($array2)[0]);
var_dump('array_values3', array_values($array3)[0]);
var_dump('array_values4', array_values($array4)[0]); // Warning

var_dump('array_slice1', array_slice($array1, 0, 1));
var_dump('array_slice2', array_slice($array2, 0, 1));
var_dump('array_slice3', array_slice($array3, 0, 1));
var_dump('array_slice4', array_slice($array4, 0, 1)); // Warning

list($elm) = $array1; // Notice
var_dump($elm);
list($elm) = $array2;
var_dump($elm);
list($elm) = $array3; // Notice
var_dump($elm);
list($elm) = $array4;
var_dump($elm);

อย่างที่คุณเห็นเรามีโซลูชัน 'หนึ่งบรรทัด' หลายตัวที่ทำงานได้ดีในบางกรณี แต่ไม่ใช่ในทุกกรณี

ในความคิดของฉันคุณควรจัดการกับอาร์เรย์เท่านั้น

ตอนนี้พูดคุยเกี่ยวกับประสิทธิภาพการทำงานสมมติว่าเรามีอาร์เรย์เสมอเช่นนี้

$elm = empty($array) ? null : ...($array);

...you would use without errors:
$array[count($array)-1];
array_shift
reset
array_values
array_slice

array_shiftจะเร็วกว่าreset, ที่มีมากขึ้นอย่างรวดเร็วกว่า [นับ () - 1] และที่สามเหล่านี้จะเร็วกว่าและarray_valuesarray_slice


2

ฉันคิดว่าผู้แต่งกำลังมองหาวิธีรับองค์ประกอบแรกของอาร์เรย์หลังจากรับจากฟังก์ชั่นบางอย่าง ( mysql_fetch_rowตัวอย่างเช่น ) โดยไม่สร้าง STRICT "เฉพาะตัวแปรที่ควรผ่านการอ้างอิง"

ถ้าเป็นเช่นนั้นวิธีการเกือบทั้งหมดที่อธิบายไว้ที่นี่จะได้รับข้อความนี้ ... และบางวิธีใช้หน่วยความจำเพิ่มเติมจำนวนมากเพื่อทำซ้ำอาร์เรย์ (หรือบางส่วนของมัน) วิธีง่ายๆในการหลีกเลี่ยงเพียงแค่กำหนดค่าอินไลน์ก่อนเรียกใช้ฟังก์ชันเหล่านี้:

$first_item_of_array = current($tmp_arr = mysql_fetch_row(...));
// or
$first_item_of_array = reset($tmp_arr = func_get_my_huge_array());

วิธีนี้คุณจะไม่ได้รับข้อความที่เข้มงวดบนหน้าจอหรือในบันทึกและคุณจะไม่สร้างอาร์เรย์เพิ่มเติมใด ๆ มันทำงานร่วมกับทั้งอาร์เรย์ที่จัดทำดัชนีและเชื่อมโยง


1

ฉันชอบตัวอย่าง "list" แต่ "list" ใช้งานได้เฉพาะทางซ้ายมือของการบ้าน หากเราไม่ต้องการกำหนดตัวแปรเราจะถูกบังคับให้สร้างชื่อชั่วคราวซึ่งจะทำให้ขอบเขตของเราแย่ที่สุดและจะเขียนทับค่าที่มีอยู่อย่างเลวร้ายที่สุด:

list($x) = some_array();
var_dump($x);

ด้านบนจะเขียนทับค่าที่มีอยู่ของ $ x และตัวแปร $ x จะวนไปมาตราบใดที่ขอบเขตนี้แอ็คทีฟ (จุดสิ้นสุดของฟังก์ชัน / เมธอดนี้หรือตลอดไปหากเราอยู่ในระดับบนสุด) สิ่งนี้สามารถแก้ไขได้โดยใช้ call_user_func และฟังก์ชั่นที่ไม่ระบุชื่อ แต่มัน clunky:

var_dump(call_user_func(function($arr) { list($x) = $arr; return $x; },
                        some_array()));

หากเราใช้ฟังก์ชั่นที่ไม่ระบุชื่อเช่นนี้เราสามารถหนีไปได้ด้วยการรีเซ็ตและ array_shift ถึงแม้ว่าพวกเขาจะใช้การอ้างอิงแบบส่งผ่าน นี่เป็นเพราะการเรียกฟังก์ชั่นจะผูกอาร์กิวเมนต์ของมันและข้อโต้แย้งเหล่านี้สามารถส่งผ่านโดยการอ้างอิง:

var_dump(call_user_func(function($arr) { return reset($arr); },
                        array_values(some_array())));

อย่างไรก็ตามนี่เป็นความจริงที่เกินจริงเนื่องจาก call_user_func จะทำการมอบหมายชั่วคราวนี้ภายใน สิ่งนี้ช่วยให้เราปฏิบัติต่อฟังก์ชั่นการส่งต่ออ้างอิงได้ราวกับว่าเป็นรหัสผ่านโดยไม่มีคำเตือนหรือข้อผิดพลาด:

var_dump(call_user_func('reset', array_values(some_array())));

1

การเปลี่ยนแปลงเล็กน้อยในสิ่งที่ Sarfraz โพสต์คือ:

$array = array(1, 2, 3, 4, 5);
$output = array_slice($array, 0, 1);
print_r ($output);

1

ฉันไม่ชอบเล่นซอกับตัวชี้ภายในของอาเรย์ แต่ก็ไม่มีประสิทธิภาพในการสร้างอาเรย์ที่สองด้วยarray_keys()หรือarray_values()ดังนั้นฉันมักจะนิยามสิ่งนี้:

function array_first(array $f) {
    foreach ($f as $v) {
        return $v;
    }
    throw new Exception('array was empty');
}

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