Nếu tôi có một mảng như:
$array['foo'] = 400;
$array['bar'] = 'xyz';
Và tôi muốn lấy mục đầu tiên ra khỏi mảng đó mà không biết chìa khóa cho nó, tôi sẽ làm thế nào? Có một chức năng cho điều này?
Nếu tôi có một mảng như:
$array['foo'] = 400;
$array['bar'] = 'xyz';
Và tôi muốn lấy mục đầu tiên ra khỏi mảng đó mà không biết chìa khóa cho nó, tôi sẽ làm thế nào? Có một chức năng cho điều này?
Câu trả lời:
reset()
cung cấp cho bạn giá trị đầu tiên của mảng nếu bạn có một phần tử bên trong mảng:
$value = reset($array);
Nó cũng cung cấp cho bạn FALSE
trong trường hợp mảng trống.
$arr = array(/* stuff */); $val = $arr? reset($arr): /* value to indicate array is empty */;
Nếu bạn không biết đủ về mảng (bạn không chắc khóa đầu tiên là foo hay bar ) thì mảng đó cũng có thể, có thể, trống .
Vì vậy, tốt nhất là kiểm tra, đặc biệt nếu có cơ hội giá trị được trả về có thể là FALSE boolean:
$value = empty($arr) ? $default : reset($arr);
Đoạn mã trên sử dụng reset
và do đó có tác dụng phụ (nó đặt lại con trỏ bên trong của mảng), vì vậy bạn có thể thích sử dụng array_slice
để truy cập nhanh một bản sao của phần tử đầu tiên của mảng:
$value = $default;
foreach(array_slice($arr, 0, 1) as $value);
Giả sử bạn muốn nhận cả khóa và giá trị riêng biệt , bạn cần thêm tham số thứ tư vào array_slice
:
foreach(array_slice($arr, 0, 1, true) as $key => $value);
Để có được mục đầu tiên dưới dạng một cặp ( key => value
):
$item = array_slice($arr, 0, 1, true);
Sửa đổi đơn giản để có được mục cuối cùng , khóa và giá trị riêng biệt:
foreach(array_slice($arr, -1, 1, true) as $key => $value);
Nếu mảng không thực sự lớn, bạn thực sự không cần array_slice
và thay vào đó có thể lấy một bản sao của toàn bộ mảng khóa, sau đó lấy mục đầu tiên:
$key = count($arr) ? array_keys($arr)[0] : null;
Tuy nhiên, nếu bạn có một mảng rất lớn, lệnh gọi array_keys
sẽ đòi hỏi nhiều thời gian và bộ nhớ hơn đáng kể array_slice
(cả hai chức năng đều đi theo mảng, nhưng chức năng này sẽ chấm dứt ngay khi nó thu thập được số lượng vật phẩm cần thiết - là một).
Một ngoại lệ đáng chú ý là khi bạn có khóa đầu tiên trỏ đến một đối tượng rất lớn và phức tạp. Trong trường hợp đó array_slice
sẽ nhân đôi đối tượng lớn đầu tiên đó, trong khi array_keys
sẽ chỉ lấy các phím.
PHP 7.3 thực hiện array_key_first()
cũng như array_key_last()
. Chúng được cung cấp rõ ràng để truy cập các khóa đầu tiên và cuối cùng một cách hiệu quả mà không cần đặt lại trạng thái bên trong của mảng làm hiệu ứng phụ.
Vì vậy, trong PHP 7.3 đầu tiên giá trị của $array
thể được truy cập với
$array[array_key_first($array)];
Mặc dù vậy, bạn vẫn kiểm tra tốt hơn rằng mảng không trống, hoặc bạn sẽ gặp lỗi:
$firstKey = array_key_first($array);
if (null === $firstKey) {
$value = "Array is empty"; // An error should be handled here
} else {
$value = $array[$firstKey];
}
Vòng lặp giả phá vỡ ở lần lặp đầu tiên:
$key = $value = NULL;
foreach ($array as $key => $value) {
break;
}
echo "$key = $value\n";
Hoặc sử dụng each()
( cảnh báo: không dùng nữa kể từ PHP 7.2.0 ):
reset($array);
list($key, $value) = each($array);
echo "$key = $value\n";
reset()
chức năng sẽ chỉ lấy giá trị đầu tiên.
Có một vài lựa chọn. array_shift()
sẽ trả về phần tử đầu tiên, nhưng nó cũng sẽ loại bỏ phần tử đầu tiên khỏi mảng.
$first = array_shift($array);
current()
sẽ trả về giá trị của mảng mà con trỏ bộ nhớ trong của nó đang trỏ tới, đây là phần tử đầu tiên theo mặc định.
$first = current($array);
Nếu bạn muốn chắc chắn rằng nó đang trỏ đến phần tử đầu tiên, bạn luôn có thể sử dụng reset()
.
reset($array);
$first = current($array);
reset()
thực sự trả về phần tử, vì vậy theo sau đó với một $first = current($array)
là dư thừa.
Để chúng ta có một số tùy chọn khác: reset($arr);
đủ tốt nếu bạn không cố gắng giữ con trỏ mảng đúng vị trí và với các mảng rất lớn, nó sẽ phải chịu một lượng chi phí tối thiểu. Điều đó nói rằng, có một số vấn đề với nó:
$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.
Cách để làm điều này mà không thay đổi con trỏ:
$arr[reset(array_keys($arr))]; // OR
reset(array_values($arr));
Lợi ích của $arr[reset(array_keys($arr))];
nó là đưa ra cảnh báo nếu mảng thực sự trống.
một cách dễ dàng và đơn giản khác để làm điều đó là sử dụng Array_values
array_values($array)[0]
reset()
là một tùy chọn tốt hơn nhiều vì nó trả về false nếu mảng trống. giải pháp của bạn sẽ không hoạt động ví dụ trong câu hỏi
array_values($array)[0] ?? FALSE
Chúng tôi có thể làm
$first = reset($array);
Thay vì
reset($array);
$first = current($array);
Như reset()
trả về phần tử đầu tiên của mảng sau khi thiết lập lại;
Sử dụng hàm reset () để lấy mục đầu tiên ra khỏi mảng đó mà không biết khóa cho nó như thế này.
$value = array('foo' => 400, 'bar' => 'xyz');
echo reset($value);
đầu ra // 400
Bạn có thể thử điều này.
Để có được giá trị đầu tiên của mảng: -
<?php
$large_array = array('foo' => 'bar', 'hello' => 'world');
var_dump(current($large_array));
?>
Để có được khóa đầu tiên của mảng
<?php
$large_array = array('foo' => 'bar', 'hello' => 'world');
$large_array_keys = array_keys($large_array);
var_dump(array_shift($large_array_keys));
?>
Tôi làm điều này để có được giá trị đầu tiên và cuối cùng. Điều này làm việc với nhiều giá trị quá.
$a = array(
'foo' => 400,
'bar' => 'xyz',
);
$first = current($a); //400
$last = end($a); //xyz
Bắt đầu với PHP 7.3.0 , có thể thực hiện mà không cần đặt lại con trỏ bên trong. Bạn sẽ sử dụng array_key_first
. Nếu bạn chắc chắn rằng mảng của bạn có giá trị thì bạn chỉ có thể làm:
$first = $array[array_key_first($array)];
Nhiều khả năng, bạn sẽ muốn xử lý trường hợp mảng trống:
$first = (empty($array)) ? $default : $array[array_key_first($array)];
bạn chỉ có thể sử dụng $array[0]
. nó sẽ cung cấp cho bạn mục đầu tiên luôn