วิธีรับรายการแรกจากอาเรย์ PHP แบบเชื่อมโยงได้อย่างไร


146

ถ้าฉันมีอาร์เรย์เช่น:

$array['foo'] = 400;
$array['bar'] = 'xyz';

และฉันต้องการเอาไอเท็มแรกออกจากอาร์เรย์นั้นโดยไม่ทราบว่ามีกุญแจสำหรับมันฉันจะทำอย่างไร มีฟังก์ชั่นนี้หรือไม่?


คำตอบ:


288

reset() ให้ค่าแรกของอาร์เรย์หากคุณมีองค์ประกอบอยู่ภายในอาร์เรย์:

$value = reset($array);

นอกจากนี้ยังให้คุณFALSEในกรณีที่อาร์เรย์ว่างเปล่า


หมายเหตุ:$arr = array(/* stuff */); $val = $arr? reset($arr): /* value to indicate array is empty */;
cwallenpoole

ข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชั่นการรีเซ็ต: www.w3schools.com/php/func_array_reset.asp
Paul Chris Jones

ถ้าฉันต้องการรับรหัสและค่าควรทำอย่างไร
Timberman

51

PHP <7.3

ถ้าคุณไม่รู้เกี่ยวกับอาเรย์มากพอ (คุณไม่แน่ใจว่าคีย์แรกเป็นฟูหรือบาร์ ) ดังนั้นอาเรย์ก็น่าจะว่างเปล่าเช่นกัน

ดังนั้นจะเป็นการดีที่สุดที่จะตรวจสอบโดยเฉพาะอย่างยิ่งหากมีโอกาสที่ค่าที่ส่งคืนอาจเป็นบูลีน FALSE:

$value = empty($arr) ? $default : reset($arr);

โค้ดด้านบนใช้resetและมีผลข้างเคียง (มันรีเซ็ตตัวชี้ภายในของอาร์เรย์) ดังนั้นคุณอาจต้องการใช้array_sliceเพื่อเข้าถึงสำเนาขององค์ประกอบแรกของอาร์เรย์อย่างรวดเร็ว:

$value = $default;
foreach(array_slice($arr, 0, 1) as $value);

สมมติว่าคุณต้องการรับทั้งคีย์และค่าแยกกันคุณต้องเพิ่มพารามิเตอร์ตัวที่สี่ในarray_slice:

foreach(array_slice($arr, 0, 1, true) as $key => $value);

วิธีรับไอเท็มแรกเป็นคู่ ( key => value):

$item = array_slice($arr, 0, 1, true);

การดัดแปลงอย่างง่ายเพื่อรับไอเท็มสุดท้ายคีย์และค่าแยก:

foreach(array_slice($arr, -1, 1, true) as $key => $value);

ประสิทธิภาพ

หากอาร์เรย์ไม่ใหญ่จริง ๆ คุณไม่ต้องการarray_sliceและสามารถรับสำเนาของคีย์ทั้งหมดจากนั้นรับไอเท็มแรก:

$key = count($arr) ? array_keys($arr)[0] : null;

หากคุณมีอาเรย์ขนาดใหญ่มากการเรียกarray_keysใช้จะต้องใช้เวลาและหน่วยความจำมากกว่านั้นarray_slice(ทั้งสองฟังก์ชั่นจะเดินไปที่อาเรย์

ข้อยกเว้นที่น่าสังเกตคือเมื่อคุณมีคีย์แรกซึ่งชี้ไปยังวัตถุที่มีขนาดใหญ่และซับซ้อน ในกรณีarray_sliceนั้นจะทำซ้ำวัตถุขนาดใหญ่ชิ้นแรกในขณะที่array_keysจะหยิบกุญแจเท่านั้น

PHP 7.3

PHP 7.3 การดำเนินการเช่นเดียวกับarray_key_first() array_key_last()สิ่งเหล่านี้มีไว้เพื่อเข้าถึงคีย์แรกและคีย์สุดท้ายอย่างมีประสิทธิภาพโดยไม่ต้องรีเซ็ตสถานะภายในของอาเรย์เป็นผลข้างเคียง

ดังนั้นใน PHP 7.3 ค่าแรกของ$arrayอาจถูกเข้าถึงด้วย

$array[array_key_first($array)];

คุณยังตรวจสอบได้ดีขึ้นว่าอาร์เรย์ไม่ว่างเปล่าหรือคุณจะได้รับข้อผิดพลาด:

$firstKey = array_key_first($array);
if (null === $firstKey) {
    $value = "Array is empty"; // An error should be handled here
} else {
    $value = $array[$firstKey];
}

@ AhmedShefeer ดีคำตอบอื่น ๆ ไม่เพียง แต่เป็นที่ยอมรับแต่ยังอยู่ที่นั่นมาแปดปีแล้ว ฉันกำลังหยิบเศษอาหารที่นี่ :-D แต่ขอบคุณสำหรับการโหวตความมั่นใจ!
LSerni

1
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดเพราะมีเพียงคำตอบเดียวที่ไม่ได้คัดค้านซึ่งให้ทั้งคีย์และค่าคือลูป foreach ที่ถูกยกเลิกซึ่งน่าอึดอัดใจ คำตอบอื่น ๆ ให้ค่าโดยไม่มีกุญแจเท่านั้น
sootsnoot

1
ชอบ ans นี้วิธีการที่ทันสมัยและปรับปรุงด้วยเวลา
sanjeet bisht

@ LSerni ไม่รู้ว่าคุณยังทำงานอยู่หรือไม่ แต่ฉันติดขัดและการโพสต์ที่ได้รับการอธิบายและปรับปรุงช่วยฉันได้ ขอบคุณ
izk

@izk ฉันใช้งานอยู่เสมอ! :-D
LSerni

44

การวนซ้ำที่ผิดพลาดในรอบแรก:

$key = $value = NULL;
foreach ($array as $key => $value) {
    break;
}

echo "$key = $value\n";

หรือใช้each()( คำเตือน: เลิกใช้ตั้งแต่ PHP 7.2.0 ):

reset($array);
list($key, $value) = each($array);

echo "$key = $value\n";

2
อาจเป็นเพราะการรีเซ็ต () นั้นง่ายกว่า
mjs

1
เนื่องจากโซลูชันอยู่ในโค้ดบรรทัดแรกของคุณ แต่คุณกำลังเขียนบรรทัดที่ไม่ต้องการอย่างสมบูรณ์ต่อไป
markus

21
รีเซ็ตจะไม่ส่งคืนกุญแจ
HarryFink

3
+1 สำหรับ 'ลูปปลอม' ฉันต้องการเรียกคืนคีย์และค่าองค์ประกอบแรกโดยไม่ผ่านแต่ละองค์ประกอบ reset()ฟังก์ชั่นเท่านั้นที่จะเรียกค่าแรก
Phil Cross

2
+1 สำหรับลูปปลอมด้วยเช่นกันฉันต้องเก็บกุญแจไว้เพื่อรีเซ็ตไม่ใช่ตัวเลือก
isJustMe

25

มีตัวเลือกน้อย array_shift()จะส่งคืนองค์ประกอบแรก แต่จะลบองค์ประกอบแรกออกจากอาร์เรย์ด้วย

$first = array_shift($array);

current() จะคืนค่าอาร์เรย์ที่ตัวชี้หน่วยความจำภายในชี้ไปซึ่งเป็นองค์ประกอบแรกตามค่าเริ่มต้น

$first = current($array);

reset()หากคุณต้องการให้แน่ใจว่ามันจะชี้ไปที่องค์ประกอบแรกคุณก็สามารถใช้

reset($array);
$first = current($array);

3
ฉันชอบคำตอบนี้มากที่สุด แต่หมายเหตุreset()จริง ๆ แล้วส่งคืนองค์ประกอบดังนั้นตามด้วย$first = current($array)ซ้ำซ้อน
Tom Auger

9

เพื่อให้เรามีตัวเลือกอื่น ๆ : reset($arr);ดีพอถ้าคุณไม่พยายามเก็บตัวชี้อาร์เรย์ไว้และด้วยอาร์เรย์ขนาดใหญ่มากมันจะมีค่าใช้จ่ายน้อยที่สุด ที่กล่าวว่ามีปัญหาบางอย่างกับมัน:

$arr = array(1,2);
current($arr); // 1
next($arr);    // 2
current($arr); // 2
reset($arr);   // 1
current($arr); // 1 !This was 2 before! We've changed the array's pointer.

วิธีการทำเช่นนี้โดยไม่เปลี่ยนพอยน์เตอร์:

$arr[reset(array_keys($arr))]; // OR
reset(array_values($arr));

ประโยชน์ของการ$arr[reset(array_keys($arr))];ที่มันจะเพิ่มคำเตือนถ้าอาร์เรย์ว่างเปล่าจริง


คำตอบที่สื่อความหมายมากและมันมีความหมายต่อผู้อื่นมาก ขอบคุณชาย
Jigar7521

7

อีกวิธีที่ง่ายและสะดวกในการใช้ array_values

array_values($array)[0]

reset()เป็นตัวเลือกที่ดีกว่ามากเพราะมันจะคืนค่าเท็จถ้าอาเรย์นั้นว่างเปล่า วิธีการแก้ปัญหาของคุณจะไม่ทำงานเช่นในคำถาม
Northys

1
ใน PHP 7+ สิ่งนี้จะทำงาน:array_values($array)[0] ?? FALSE
MarthyM

4

ทดสอบว่าตัวแปรเป็นอาร์เรย์ก่อนรับองค์ประกอบแรกหรือไม่ เมื่อสร้างอาร์เรย์แบบไดนามิกถ้าตั้งค่าเป็นโมฆะคุณจะได้รับข้อผิดพลาด

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

if(is_array($array))
{
  reset($array);
  $first = key($array);
}

3

เราทำได้ $first = reset($array);

แทน

reset($array);
$first = current($array);

เช่น reset()

ส่งกลับองค์ประกอบแรกของอาร์เรย์หลังจากรีเซ็ต;



2

ใช้ฟังก์ชั่นรีเซ็ต () เพื่อดึงไอเท็มแรกออกจากอาร์เรย์นั้นโดยไม่ต้องรู้รหัสสำหรับสิ่งนี้

$value = array('foo' => 400, 'bar' => 'xyz');
echo reset($value);

เอาต์พุต // 400


2

คุณสามารถลองสิ่งนี้

ในการรับค่าแรกของอาร์เรย์: -

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   var_dump(current($large_array));
?>

เพื่อรับคีย์แรกของอาร์เรย์

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   $large_array_keys = array_keys($large_array);
   var_dump(array_shift($large_array_keys));
?>


1

ฉันทำสิ่งนี้เพื่อรับค่าแรกและค่าสุดท้าย ใช้งานได้กับค่ามากขึ้นเช่นกัน

$a = array(
    'foo' => 400,
    'bar' => 'xyz',
);
$first = current($a);   //400
$last = end($a);    //xyz

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

1

เริ่มต้นด้วยPHP 7.3.0เป็นไปได้ที่จะทำโดยไม่ต้องรีเซ็ตตัวชี้ภายใน array_key_firstคุณจะใช้ หากคุณแน่ใจว่าอาร์เรย์ของคุณมีค่าอยู่คุณก็สามารถทำได้:

$first = $array[array_key_first($array)];

มีโอกาสมากขึ้นที่คุณจะต้องจัดการกับกรณีที่อาร์เรย์ว่างเปล่า:

$first = (empty($array)) ? $default : $array[array_key_first($array)];

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