ฉันจะรับคีย์สุดท้ายของอาร์เรย์ได้อย่างไร
ฉันจะรับคีย์สุดท้ายของอาร์เรย์ได้อย่างไร
คำตอบ:
วิธีแก้ปัญหาคือการใช้การรวมกันของ(end
และการอ้างอิง) :key
end()
เลื่อนตัวชี้ภายในของอาร์เรย์ไปยังองค์ประกอบสุดท้ายและส่งกลับค่าของมัน key()
ส่งคืนองค์ประกอบดัชนีของตำแหน่งอาร์เรย์ปัจจุบัน ดังนั้นส่วนของรหัสเช่นนี้ควรทำเคล็ดลับ:
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
end($array); // move the internal pointer to the end of the array
$key = key($array); // fetches the key of the element pointed to by the internal pointer
var_dump($key);
จะส่งออก:
string 'last' (length=4)
เช่นกุญแจสำคัญขององค์ประกอบสุดท้ายของอาร์เรย์ของฉัน
หลังจากเสร็จสิ้นตัวชี้ภายในของอาเรย์จะอยู่ที่ส่วนท้ายของอาเรย์ ตามที่ระบุไว้ในความคิดเห็นคุณอาจต้องการเรียกใช้reset()
บนอาร์เรย์เพื่อนำตัวชี้กลับไปที่จุดเริ่มต้นของอาร์เรย์
reset()
) ; แต่คุณถูกต้องในการชี้ฟังก์ชั่นนั้นซึ่งอาจมีประโยชน์
array('a', 'b', 'c', 'd', 'a')
จะส่งคืนคีย์ 0 แทน 4
แม้ว่าend()
ดูเหมือนจะง่ายที่สุด แต่ก็ไม่เร็วที่สุด ทางเลือกที่เร็วกว่าและแข็งแกร่งกว่าคือarray_slice()
:
$lastKey = key(array_slice($array, -1, 1, true));
ดังที่การทดสอบบอกว่าในอาเรย์ที่มีองค์ประกอบ 500,000 มันก็เร็วขึ้นเกือบ 7 เท่า!
end($arr);$key = key($arr);reset($arr);
กับ (b) $key = key(array_slice($arr,-1,1,true));
... ซึ่งทำให้end()
เร็วขึ้นมาก! end () = 0.05326 วินาที, array_slice = 8.506 วินาที ... huh ??
end()
เร็วที่สุดเพราะสามารถหาได้จากฟังก์ชั่น C ที่ง่ายมากเช่น:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
last
เป็นองค์ประกอบสุดท้าย ทำให้end()
O สวยมาก (1) :-)
ฉันชอบ
end(array_keys($myarr))
end((array_keys($myarr)))
เพื่อหลีกเลี่ยงการแจ้งให้ทราบล่วงหน้า
ตั้งแต่PHP 7.3 (2018)มีฟังก์ชั่น (ในที่สุด) สำหรับสิ่งนี้: http://php.net/manual/en/function.array-key-last.php
$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )
จะส่งออก
orange
เพียงใช้: echo $array[count($array) - 1];
int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
ซึ่งเป็น น่าสนใจ แต่ไม่ดีสำหรับธุรกิจเมื่อคุณมีเวลา จำกัด
$a[1] = 1; $a[5] = 5; $a[0] = 0;
คุณจะมีอาเรย์ที่มีคีย์ (1, 5, 0) ตามลำดับ count($a)
จะให้ผล 3 และ$a[2]
ไม่ได้กำหนดไว้ มันไม่ได้ให้ 5 อย่างแน่นอน
ไม่ทราบว่ามันจะเร็วกว่านี้หรือไม่ แต่ดูเหมือนง่ายกว่าที่จะทำเช่นนี้และคุณหลีกเลี่ยงข้อผิดพลาดโดยไม่ผ่านฟังก์ชั่นเพื่อสิ้นสุด () ...
มันแค่ต้องการตัวแปร ... ไม่ใช่เรื่องใหญ่ในการเขียนโค้ดอีกหนึ่งบรรทัดจากนั้นก็ยกเลิกมันถ้าคุณต้องการ
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
$keys = array_keys($array);
$last = end($keys);
ตั้งแต่PHP7.3คุณสามารถเข้าถึงคีย์สุดท้ายในโดยตรง (ระดับนอกของ) อาร์เรย์ที่มีarray_key_last ()
การอภิปรายทำให้การอภิปรายมากในหน้านี้นอน มันเป็นนักแสดงที่ดีที่สุดที่ลงมือไม่มีผลข้างเคียงใด ๆ และเป็นเทคนิคการโทรครั้งเดียวที่ใช้งานง่ายและใช้งานง่ายเพื่อส่งมอบสิ่งที่คำถามนี้ต้องการ
เกณฑ์มาตรฐานคร่าวๆเป็นหลักฐาน: https://3v4l.org/hO1Yf
array_slice() + key(): 1.4 end() + key(): 13.7 array_key_last(): 0.00015
* อาร์เรย์ทดสอบมีองค์ประกอบ 500,000 รายการ microtime ทำซ้ำ 100x จากนั้นเฉลี่ยแล้วคูณด้วย 1,000 เพื่อหลีกเลี่ยงสัญลักษณ์ทางวิทยาศาสตร์ เครดิต @MAChitgarha สำหรับมาตรฐานเริ่มต้นแสดงความคิดเห็นภายใต้@ คำตอบของ
หมายความว่าคุณสามารถดึงค่าของคีย์สุดท้ายได้โดยไม่ต้อง:
ฟังก์ชั่นนี้ค้างชำระเป็นเวลานานและนอกจากนี้ยังมีเข็มขัดเครื่องมือเสริมฟังก์ชั่นอาเรย์ที่ช่วยเพิ่มประสิทธิภาพหลีกเลี่ยงผลข้างเคียงที่ไม่พึงประสงค์
นี่คือตัวอย่าง :
$array = ["a" => "one", "b" => "two", "c" => "three"];
if (!function_exists('array_key_last')) {
echo "please upgrade to php7.3";
} else {
echo "First Key: " , key($array) , "\n";
echo "Last Key: " , array_key_last($array) , "\n";
next($array); // move array pointer to second element
echo "Second Key: " , key($array) , "\n";
echo "Still Last Key: " , array_key_last($array);
}
เอาท์พุท:
First Key: a
Last Key: c // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c // <-- unaffected by the pointer position, NICE!
หมายเหตุบางส่วน:
array_key_last()
เป็นฟังก์ชั่นของพี่น้อง array_key_first ()null
ถ้าอาเรย์นั้นว่างเปล่าarray_value_first()
&array_value_last()
) ก็จะเสนอการเข้าถึงตัวชี้แบบไม่รู้เขินถึงองค์ประกอบ bookend แต่เห็นได้ชัดว่าพวกเขาล้มเหลวในการรวบรวมคะแนนเสียงที่เพียงพอที่จะมีชีวิตขึ้นมานี่คือหน้าที่เกี่ยวข้องบางส่วนที่พูดถึงคุณสมบัติใหม่:
ป.ล. หากใครกำลังชั่งน้ำหนักเทคนิคอื่น ๆ บางอย่างคุณอาจอ้างถึงชุดของการเปรียบเทียบขนาดเล็ก: ( สาธิต )
Duration of array_slice() + key(): 0.35353660583496 Duration of end() + key(): 6.7495584487915 Duration of array_key_last(): 0.00025749206542969 Duration of array_keys() + end(): 7.6123380661011 Duration of array_reverse() + key(): 6.7875385284424 Duration of array_slice() + foreach(): 0.28870105743408
ลองใช้ฟังก์ชั่นarray_popและarray_keysดังนี้:
<?php
$array = array(
'one' => 1,
'two' => 2,
'three' => 3
);
echo array_pop(array_keys($array)); // prints three
?>
array_pop()
ทำงานกับค่าตอบแทนของarray_keys()
และไม่ได้อยู่ในอาร์เรย์เดิม
ณ PHP> = 7.3 array_key_last()
เป็นวิธีที่ดีที่สุดในการรับคีย์สุดท้ายของอาเรย์ใด ๆ โดยใช้การรวมend()
, key()
และreset()
เพียงเพื่อให้ได้ที่สำคัญสุดท้ายของอาร์เรย์เป็นอุกอาจ
$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3
เปรียบเทียบกับ
end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)
คุณต้องรีเซ็ตอาร์เรย์เพื่อให้ตัวชี้อยู่ที่จุดเริ่มต้นหากคุณใช้การรวมกันของend()
และkey()
ฉันต้องการเสนอทางเลือกอื่นในการแก้ไขปัญหานี้
สมมติว่าคีย์ทั้งหมดของคุณเป็นตัวเลขโดยไม่มีช่องว่างวิธีที่ฉันชอบคือการนับอาร์เรย์จากนั้นลบ 1 จากค่านั้น (เพื่อพิจารณาว่าคีย์อาร์เรย์เริ่มต้นที่ 0
$array = array(0=>'dog', 1=>'cat');
$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];
var_dump($lastKey);
print_r($lastKeyValue);
สิ่งนี้จะทำให้คุณ:
แมว (1)
คุณสามารถใช้สิ่งนี้:
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array);
echo key($array);
โซลูชันอื่นคือการสร้างฟังก์ชั่นและใช้งาน:
function endKey($array){
end($array);
return key($array);
}
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3
ฉันเพิ่งใช้ตัวช่วยจากแซนเดอร์และปรับปรุงด้วยคำตอบก่อนหน้านี้:
function last($array){
$keys = array_keys($array);
return end($keys);
}
$arr = array("one" => "apple", "two" => "orange", "three" => "pear");
echo last($arr);
echo $arr(last($arr));
array_reverse()
ลองนี้กับ
$arr = array(
'first' => 01,
'second' => 10,
'third' => 20,
);
$key = key(array_reverse($arr));
var_dump($key);
มันแปลก แต่ทำไมหัวข้อนี้ไม่มีคำตอบนี้:
$lastKey = array_keys($array)[count($array)-1];
$array = array(
'something' => array(1,2,3),
'somethingelse' => array(1,2,3,4)
);
$last_value = end($array);
$last_key = key($array); // 'somethingelse'
ใช้งานได้เนื่องจาก PHP ย้ายตัวชี้อาร์เรย์ไปภายในเพื่อ $ array
ทางออกที่ดีที่สุดที่สามารถใช้อินไลน์ได้:
end($arr) && false ?: key($arr)
โซลูชันนี้เป็นเพียงนิพจน์ / คำสั่งและการให้ดีไม่ใช่ประสิทธิภาพที่ดีที่สุด
การใช้ตัวอย่างแบบอินไลน์:
$obj->setValue(
end($arr) && false ?: key($arr) // last $arr key
);
อัพเดท: ใน PHP 7.3+: ใช้ (แน่นอน) array_key_last()
วิธีการที่เพิ่งเพิ่มเข้ามา