Làm thế nào để có được mục đầu tiên từ một mảng PHP kết hợp?


146

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?


(tham khảo) MảngHàm mảng
Gordon

Câu trả lời:


288

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 FALSEtrong trường hợp mảng trống.


Lưu ý:$arr = array(/* stuff */); $val = $arr? reset($arr): /* value to indicate array is empty */;
cwallenpoole

Thông tin thêm về chức năng đặt lại: www.w3schools.com/php/func_array_reset.asp
Paul Chris Jones

Nếu tôi muốn lấy chìa khóa và giá trị thì sao?
Thợ rừng

51

PHP <7.3

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 resetvà 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);

hiệu suất

Nếu mảng không thực sự lớn, bạn thực sự không cần array_slicevà 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_keyssẽ đò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_slicesẽ nhân đôi đối tượng lớn đầu tiên đó, trong khi array_keyssẽ chỉ lấy các phím.

PHP 7.3

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 $arraythể đượ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];
}

@AhmedShefeer tốt, câu trả lời khác không chỉ là câu được chấp nhận mà còn ở đó thêm tám năm nữa . Tôi sắp xếp những mẩu vụn ở đây :-D. Nhưng cảm ơn vì đã bỏ phiếu tín nhiệm!
LSerni

1
Đối với tôi có vẻ như đây là câu trả lời tốt nhất, vì chỉ có một câu trả lời không bị phản đối khác cung cấp cả khóa và giá trị là vòng lặp foreach bị hủy bỏ, điều này thật khó xử. Các câu trả lời khác chỉ đưa ra giá trị mà không có khóa.
sootsnoot

1
yêu thích ans này, cách tiếp cận hiện đại và cập nhật với thời gian.
sanjeet bisht

@LSerni Không biết bạn có còn hoạt động không, nhưng tôi đã bị kẹt và bài đăng được giải thích và cập nhật tốt này đã cứu tôi. Cảm ơn bạn
izk

@izk Tôi luôn hoạt động! :-D
LSerni

44

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";

2
Có lẽ bởi vì reset () đơn giản hơn.
mjs

1
Bởi vì giải pháp nằm trong dòng mã đầu tiên của bạn nhưng bạn đang tiếp tục viết một dòng hoàn toàn không cần thiết khác.
markus

21
đặt lại sẽ không trả lại chìa khóa
HarryFink

3
+1 cho 'vòng lặp giả'. Tôi đã cần truy xuất khóa và giá trị phần tử đầu tiên, trong khi không đi qua từng phần tử. Các reset()chức năng sẽ chỉ lấy giá trị đầu tiên.
Phil Cross

2
+1 cho vòng lặp giả cũng vậy, tôi cần giữ khóa để thiết lập lại không phải là một tùy chọn
isJustMe

25

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);

3
Tôi thích câu trả lời này là đầy đủ nhất, nhưng lưu ý 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.
Tom Auger

9

Để 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.


câu trả lời rất mô tả, và nó có ý nghĩa rất lớn với người khác. Cảm ơn người đàn ông.
Jigar7521

7

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
Northys

1
Trong PHP 7+, một cái gì đó như thế này sẽ hoạt động:array_values($array)[0] ?? FALSE
MarthyM

4

Kiểm tra nếu một biến là một mảng trước khi lấy phần tử đầu tiên. Khi tự động tạo mảng nếu nó được đặt thành null, bạn sẽ gặp lỗi.

Ví dụ:

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

3

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;


2

Bạn có thể làm:

$values = array_values($array);
echo $values[0];

2

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


2

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));
?>


1

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

Điều này chỉ hoạt động khi con trỏ bên trong là ở phần tử đầu tiên. Mặc dù điều này là tốt vì nó không đặt lại vị trí của con trỏ, nhưng nó chỉ hoạt động khi con trỏ đã nghỉ.
cjc

1

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)];

-3

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.