Làm thế nào tôi có thể nhận được khóa cuối cùng của một mảng?
Làm thế nào tôi có thể nhận được khóa cuối cùng của một mảng?
Câu trả lời:
Một giải pháp sẽ là sử dụng kết hợp end
và (trích dẫn) :key
end()
tiến con trỏ bên trong của mảng đến phần tử cuối cùng và trả về giá trị của nó. key()
trả về phần tử chỉ mục của vị trí mảng hiện tại. Vì vậy, một phần của mã như thế này nên thực hiện thủ thuật:
$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);
Sẽ xuất:
string 'last' (length=4)
tức là khóa của phần tử cuối cùng của mảng của tôi.
Sau khi hoàn thành, con trỏ bên trong của mảng sẽ ở cuối mảng. Như đã chỉ ra trong các ý kiến, bạn có thể muốn chạy reset()
trên mảng để đưa con trỏ trở lại đầu mảng.
reset()
) ;; nhưng bạn đã đúng khi chỉ ra chức năng đó, có thể hữu ích.
array('a', 'b', 'c', 'd', 'a')
nó sẽ trả về khóa 0 thay vì 4.
Mặc dù end()
có vẻ là dễ nhất, nhưng nó không phải là nhanh nhất. Sự thay thế nhanh hơn và mạnh hơn nhiều là array_slice()
:
$lastKey = key(array_slice($array, -1, 1, true));
Như các thử nghiệm nói , trên một mảng có 500000 phần tử, nó nhanh hơn gần 7 lần!
end($arr);$key = key($arr);reset($arr);
với (b) $key = key(array_slice($arr,-1,1,true));
... kết quả end()
là NHIỀU nhanh hơn! end () = 0,05326 giây, mảng_slice = 8,506 giây ... hả ??
end()
là nhanh nhất vì nó có thể được bắt nguồn từ một hàm C rất đơn giản, chẳng hạn như:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
last
đến phần tử cuối cùng. Làm end()
khá nhiều O (1). :-)
tôi thích
end(array_keys($myarr))
end((array_keys($myarr)))
để có được xung quanh thông báo.
Vì PHP 7.3 (2018) có chức năng (cuối cùng) cho việc này: http://php.net/manual/en/feft.array-key-last.php
$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )
sẽ xuất
orange
Chỉ dùng : echo $array[count($array) - 1];
int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
đó là thú vị nhưng không tốt cho kinh doanh khi bạn có ngân sách thời gian
$a[1] = 1; $a[5] = 5; $a[0] = 0;
thì bạn sẽ có một mảng với các khóa (1, 5, 0), theo thứ tự đó. count($a)
sẽ mang lại 3 và $a[2]
không được xác định. Nó chắc chắn không cung cấp cho bạn 5 trở lại.
Không biết điều này sẽ nhanh hơn hay không, nhưng có vẻ dễ dàng hơn để làm theo cách này và bạn tránh được lỗi bằng cách không chuyển vào một hàm để kết thúc () ...
nó chỉ cần một biến ... không phải là vấn đề lớn để viết thêm một dòng mã, sau đó bỏ đặt nó nếu bạn cần.
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
$keys = array_keys($array);
$last = end($keys);
Kể từ PHP7.3, bạn có thể truy cập trực tiếp vào khóa cuối cùng trong (cấp độ bên ngoài) của một mảng với mảng_key_last ()
Việc dứt khoát đặt nhiều cuộc tranh luận trên trang này lên giường. Đây là người thực hiện tốt nhất, không có tác dụng phụ và là một kỹ thuật gọi trực tiếp, trực quan, để cung cấp chính xác những gì câu hỏi này tìm kiếm.
Một điểm chuẩn thô như bằng chứng: https://3v4l.org/hO1Yf
array_slice() + key(): 1.4 end() + key(): 13.7 array_key_last(): 0.00015
* mảng thử nghiệm chứa 500000 phần tử, microtime lặp lại 100 lần sau đó tính trung bình sau đó nhân với 1000 để tránh ký hiệu khoa học. Tín dụng cho @MAChitgarha cho điểm chuẩn ban đầu được nhận xét dưới câu trả lời của @ TadejMagajna .
Điều này có nghĩa là bạn có thể truy xuất giá trị của khóa cuối cùng mà không cần:
Chức năng này đã quá hạn lâu và là sự bổ sung đáng hoan nghênh cho vành đai công cụ chức năng mảng giúp cải thiện hiệu suất, tránh các tác dụng phụ không mong muốn và cho phép mã sạch / trực tiếp / trực quan.
Đây là một bản demo :
$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);
}
Đầu ra:
First Key: a
Last Key: c // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c // <-- unaffected by the pointer position, NICE!
Một số lưu ý:
array_key_last()
là hàm anh chị em của mảng_key_first () .null
nếu mảng trống.array_value_first()
& array_value_last()
) cũng sẽ cung cấp quyền truy cập không biết đến con trỏ vào các yếu tố boopool, nhưng rõ ràng là chúng đã thất bại trong việc thu thập đủ phiếu bầu để đi vào cuộc sống.Dưới đây là một số trang có liên quan thảo luận về các tính năng mới:
ps Nếu bất cứ ai đang cân nhắc một số kỹ thuật khác, bạn có thể tham khảo bộ sưu tập so sánh nhỏ này: ( Bản trình diễn )
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
Hãy thử sử dụng array_pop và array_keys chức năng như sau:
<?php
$array = array(
'one' => 1,
'two' => 2,
'three' => 3
);
echo array_pop(array_keys($array)); // prints three
?>
array_pop()
hoạt động dựa trên giá trị trả về array_keys()
và không phải trên mảng ban đầu.
Kể từ PHP> = 7.3 array_key_last()
là cách tốt nhất để lấy khóa cuối cùng của bất kỳ mảng nào. Sử dụng kết hợp end()
, key()
và reset()
chỉ để có được chìa khóa cuối cùng của một mảng là thái quá.
$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3
so sánh nó với
end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)
Bạn phải đặt lại mảng cho con trỏ ở đầu nếu bạn đang sử dụng kết hợp end()
vàkey()
Tôi cũng muốn cung cấp một giải pháp thay thế cho vấn đề này.
Giả sử tất cả các khóa của bạn là số mà không có bất kỳ khoảng trống nào, phương pháp ưa thích của tôi là đếm mảng sau đó trừ 1 từ giá trị đó (để tính đến thực tế là các khóa mảng bắt đầu từ 0.
$array = array(0=>'dog', 1=>'cat');
$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];
var_dump($lastKey);
print_r($lastKeyValue);
Điều này sẽ cung cấp cho bạn:
int (1) mèo
Bạn có thể sử dụng điều này:
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array);
echo key($array);
Một giải pháp khác là tạo một hàm và sử dụng nó:
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
$array = array(
'something' => array(1,2,3),
'somethingelse' => array(1,2,3,4)
);
$last_value = end($array);
$last_key = key($array); // 'somethingelse'
Điều này hoạt động vì PHP di chuyển con trỏ mảng bên trong cho $ mảng
Giải pháp tốt nhất có thể được sử dụng nội tuyến được sử dụng:
end($arr) && false ?: key($arr)
Giải pháp này chỉ là biểu thức / tuyên bố và cung cấp tốt không phải là hiệu suất tốt nhất có thể.
Sử dụng ví dụ nội tuyến:
$obj->setValue(
end($arr) && false ?: key($arr) // last $arr key
);
CẬP NHẬT: Trong PHP 7.3+: sử dụng (tất nhiên) array_key_last()
phương thức mới được thêm vào .