Lấy phần tử đầu tiên của một mảng


1071

Tôi có một mảng:

array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )

Tôi muốn có được phần tử đầu tiên của mảng này. Kết quả dự kiến: chuỗi apple

Một yêu cầu: nó không thể được thực hiện bằng cách chuyển qua tham chiếu , vì vậy array_shiftkhông phải là một giải pháp tốt.

Tôi có thể làm cái này như thế nào?


1
Ý bạn là gì, không thể được thực hiện bằng cách tham khảo?
cjk

Chức năng không nên hoạt động bằng cách sử dụng &$arraynhư params.
hsz

4
Tôi nghi ngờ rằng những gì bạn "thực sự" có nghĩa là "không thể được thực hiện bằng tham chiếu", là mảng của bạn đang được trả về động từ cơ sở dữ liệu và bạn không muốn chuyển mảng vào một biến trước khi lấy phần tử đầu tiên từ nó. Nếu tôi đúng, thì phần lớn tất cả các giải pháp được cung cấp cho bạn dưới đây (bao gồm cả câu trả lời được chấp nhận), là không đủ.
cartb Beforehorse

Bạn chỉ cần lấy nó hoặc lấy nó và loại bỏ nó khỏi mảng hiện có?
Jo Smo

Để sử dụng cơ bản Mảng, bạn có thể xem lại liên kết này Technofusions.com/int sinhtion
Vikrant Vir Bhalla

Câu trả lời:


1367

Câu trả lời gốc, nhưng tốn kém (O (n)):

array_shift(array_values($array));

Trong O (1):

array_pop(array_reverse($array));

Các trường hợp sử dụng khác, v.v ...

Nếu sửa đổi (theo nghĩa đặt lại các con trỏ mảng) $arraykhông phải là vấn đề, bạn có thể sử dụng:

reset($array);

Điều này sẽ hiệu quả hơn về mặt lý thuyết, nếu cần một "bản sao" mảng:

array_shift(array_slice($array, 0, 1));

Với PHP 5.4+ (nhưng có thể gây ra lỗi chỉ mục nếu trống):

array_values($array)[0];

77
+1 cho cách giải quyết thông minh để ngăn sửa đổi mảng ban đầu bằng mảng_values ​​()
ChrisR

44
Tôi nhận được điều này: <b> Tiêu chuẩn nghiêm ngặt </ b>: Chỉ các biến được truyền qua tham chiếu. Cách giải quyết tốt đẹp btw
Simone

191
Đây không phải là một chút quá mức? Điều gì xảy ra nếu mảng chứa hàng ngàn phần tử? Có hợp lý để tạo ra một mảng hoàn toàn mới chỉ để có được phần tử đầu tiên của nó? list()reset()là giải pháp tốt hơn nhiều theo quan điểm của tôi.
Martin Dimitrov

33
Tôi đồng ý. Tổng số quá mức và tài nguyên đặc biệt nặng so với một dòng đặt lại và trả về giá trị hiện tại: reset (mảng $);
zmonteca

48
-1 Như các nhà bình luận ở trên đã nói. Nó gây trở ngại cho tôi rằng điều này có 101 upvote.
Các cuộc đua nhẹ nhàng trong quỹ đạo

790

Như Mike đã chỉ ra (cách dễ nhất có thể):

$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
echo reset($arr); // Echoes "apple"

Nếu bạn muốn lấy khóa: (thực hiện nó sau khi đặt lại)

echo key($arr); // Echoes "4"

Từ tài liệu của PHP :

thiết lập lại hỗn hợp (mảng & $ mảng );

Sự miêu tả:

reset () tua lại con trỏ bên trong của mảng thành phần tử đầu tiên và trả về giá trị của phần tử mảng đầu tiên hoặc FALSE nếu mảng trống.


Mặc dù nó được truyền bằng tham chiếu để thiết lập lại, mảng ban đầu không được sửa đổi. Tôi đoán đó là lý do hsz không muốn vượt qua nó bằng cách tham khảo ..?
Dennis Jamin

10
Trình lặp của mảng được sửa đổi. Nếu bạn làm điều này trong một foreachmảng chủ đề, bạn sẽ làm hỏng nó.
Zenexer

2
@Zenexer điều này không phải lúc nào cũng (thường) đúng. Thông thường trong thực tế, foreachsẽ sao chép mảng mà nó lặp qua.
Luke anh em họ

1
@Angger sau khi đặt lại, bạn có thể gọi key($arr)và bạn sẽ nhận được '4' (được thêm vào câu trả lời)
lepe

3
Cả @Zenexer và Luke Cousins ​​đều không đúng: 1) foreach không sử dụng con trỏ internat của một mảng - thay vào đó, nó tạo ra con trỏ của chính nó. Thật dễ dàng để kiểm tra thiết lập lại cuộc gọi bên trong foreach - vòng lặp sẽ theo cách của nó mà không có hiệu lực từ reset(). 2) Không, foreach KHÔNG tạo bản sao của một mảng !!! Nó chỉ tạo ra con trỏ riêng của nó (thậm chí không phải là bản sao của một con trỏ hiện có - nó cũng dễ dàng kiểm tra, gọi next()trước khi thuyết minh).
dmikam

278
$first_value = reset($array); // First element's value
$first_key = key($array); // First element's key

2
Tôi chưa thực sự thử nghiệm nó, nhưng có vẻ như cách tiếp cận này sẽ hiệu quả nhất.
mason81

4
Vấn đề duy nhất là câu hỏi yêu cầu giá trị, không phải là chìa khóa. Do đó, hiện tại ($ mảng) nên được sử dụng thay vì khóa (mảng $)
zmonteca

4
@zmonteca $ first_value = reset (mảng $); Ở đây bạn nhận được giá trị, hàm reset () tua lại mảng con trỏ bên trong và trả về phần tử đầu tiên.
S3Mi

1
Câu trả lời hay nhất! đang tìm kiếm sự tương đương của khóa () để có được giá trị đầu tiên. Điều này có ích!
Alain Tiemblo

98
$arr = array( 9 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // echoes 'apple'

Nếu bạn không muốn mất vị trí con trỏ hiện tại, chỉ cần tạo bí danh cho mảng.


1
không hiểu nó, ý bạn là gì? Nó hoạt động tốt cho dù chìa khóa đầu tiên lớn hơn những cái khác.
yoda

29
+1 FYI reset() đã trả về phần tử đầu tiên, do đó không cần sử dụng current()- echo reset($arr)nên đủ
Mike

@ Mike nhưng bạn có thể thích currentđể resettránh PHP thông báo / báo lỗi được sản xuất trong những trường hợp tham khảo, ví dụ như current(array_filter(...));trong 3v4l .
CPHPython

91

current($array)có thể giúp bạn có được phần tử đầu tiên của một mảng, theo hướng dẫn sử dụng PHP .

Mỗi mảng có một con trỏ bên trong tới phần tử "hiện tại" của nó, được khởi tạo cho phần tử đầu tiên được chèn vào mảng.

Vì vậy, nó hoạt động cho đến khi bạn đã định vị lại con trỏ mảng và nếu không bạn sẽ phải đặt lại mảng.


4
Tôi không biết tại sao đây không phải là câu trả lời được chấp nhận, vì nó trả lời câu hỏi khá đơn giản và chính xác.
tái hiện

26
current($array)sẽ chỉ hoạt động nếu con trỏ mảng "hiện tại" trỏ đến phần tử đầu tiên, nếu không reset($array)sẽ được yêu cầu.
Jon

6
Dường như current()không còn yêu cầu tham chiếu, mặc dù các tài liệu PHP không phản ánh điều này. Vì vậy, tôi nghĩ rằng điều này đã trở thành giải pháp tốt nhất.
Ryan

@Ryan đồng ý, nhưng giải pháp này đã được đưa ra 2 năm trước năm 2014 trong câu trả lời khác này của cùng một chủ đề ... Thật kỳ lạ là câu không đầy đủ này có nhiều upvote hơn.
CPHPython

70

Bạn có thể lấy phần tử thứ N với cấu trúc ngôn ngữ, "list":

// First item
list($firstItem) = $yourArray;

// First item from an array that is returned from a function
list($firstItem) = functionThatReturnsArray();

// Second item
list( , $secondItem) = $yourArray;

Với array_keyschức năng bạn có thể làm tương tự cho các phím:

list($firstKey) = array_keys($yourArray);
list(, $secondKey) = array_keys($yourArray);

2
Đây chính xác là những gì tôi làm: list($first_value) = $my_array;Theo tôi, lựa chọn tốt nhất. Nó không có vấn đề từ các câu trả lời khác được trình bày ở đây: không "quá mức" bởi vì nó không sao chép hoặc mảng hoặc tạo một câu trả lời mới. Không có "tài liệu tham khảo": mảng không được sửa đổi. Không "thiết lập lại": không thay đổi con trỏ bên trong mảng ...
J. Bruni

6
Giải pháp rất thanh lịch, nhưng ném E_NOTICE khi mảng trống.
Tgr

1
@ Giống như có, nhưng sau đó nó không còn thanh lịch nữa :)
Tgr

13
Điều này có sai không?! Nó chỉ hoạt động nếu các khóa mảng là int, thử làm list($firstItem) = array('key1' => 'value1');và bạn sẽ gặp lỗiNotice: Undefined offset: 0
Marco Demaio

12
Để làm rõ: list($x) = foo();tương đương với $x = foo()[0];. Lưu ý rằng điều này không nhất thiết giống như "lấy mục đầu tiên", vì ngay cả một mảng được lập chỉ mục số nguyên có thể không có phần tử với khóa 0. Trong trường hợp của tôi, tôi đã thực hiện "list ($ order) = get_order ($ user) ; " nhưng "get_order" đã trả về các đơn đặt hàng được khóa bởi ID của chúng, thường là 0. Như @Sergiy nói, mảng_values ​​() sửa lỗi này, nhưng làm giảm tính hiệu quả và (quan trọng hơn) của mã.
Warbo

55

PHP 5.4+:

array_values($array)[0];

Điều này là dành cho những người tuyệt vời, những người chạy mới nhất và vĩ đại nhất. ;)
Zenexer

1
Anh ấy đã chỉnh sửa câu trả lời của mình vào tháng 10 năm 2013 để bao gồm câu trả lời của tôi mà tôi đã thêm vào tháng Tư.
Samer Ata

PHP 4:$array_values = array_values($array); $value = $array_values[0];
zdick

38

PHP 7.3 bổ sung thêm hai chức năng để khai thác đầu tiên và quan trọng nhất của một mảng trực tiếp mà không sửa đổi của mảng ban đầu và không tạo ra bất kỳ đối tượng tạm thời:

Ngoài việc có ý nghĩa về mặt ngữ nghĩa, các hàm này thậm chí không di chuyển con trỏ mảng (như foreach sẽ làm).

Có các khóa, người ta có thể lấy các giá trị bằng các phím trực tiếp.


Các ví dụ (tất cả chúng đều yêu cầu PHP 7.3+)

Lấy khóa đầu tiên / cuối cùng và giá trị:

$my_array = ['IT', 'rules', 'the', 'world'];

$first_key = array_key_first($my_array);
$first_value = $my_array[$first_key];

$last_key = array_key_last($my_array);
$last_value = $my_array[$last_key];

Lấy giá trị đầu tiên / cuối cùng dưới dạng một lớp, giả sử mảng có thể trống :

$first_value = $my_array[ array_key_first($my_array) ];

$last_value = $my_array[ array_key_last($my_array) ];

Lấy giá trị đầu tiên / cuối cùng dưới dạng một lớp, với mặc định cho các mảng trống:

$first_value = empty($my_array) ? 'default' : $my_array[ array_key_first($my_array) ];

$last_value = empty($my_array) ? 'default' : $my_array[ array_key_last($my_array) ];

Rút ngắn với toán tử hợp nhất null , thường là null mặc định: $first_value = $my_array[array_key_first($my_array)] ?? null;
Mitchell McKenna

29

Giả sử:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

Chỉ dùng:

$array[key($array)]

để có được yếu tố đầu tiên hoặc

key($array)

để lấy chìa khóa đầu tiên.

Hoặc bạn có thể hủy liên kết đầu tiên nếu bạn muốn loại bỏ nó.


9
Wht không chỉ đơn giản là sử dụng currentsau đó?
Marco Demaio

27

Một số mảng không hoạt động với các hàm như list,reset hoặc current. Có thể chúng là mảng "giả" - ví dụ triển khai ArrayIterator một phần.

Nếu bạn muốn kéo giá trị đầu tiên bất kể mảng nào, bạn có thể đoản mạch một vòng lặp:

foreach($array_with_unknown_keys as $value) break;

Giá trị của bạn sau đó sẽ có sẵn trong $value và vòng lặp sẽ bị hỏng sau lần lặp đầu tiên. Điều này hiệu quả hơn so với việc sao chép một mảng có khả năng lớn sang một hàm như Array_unshift (Array_values ​​($ Array)).

Bạn cũng có thể lấy chìa khóa theo cách này:

foreach($array_with_unknown_keys as $key=>$value) break;

Nếu bạn đang gọi hàm này từ một hàm, chỉ cần quay lại sớm:

function grab_first($arr) {
    foreach($arr as $value) return $value;
}

Tôi cho rằng đây là một trong những cách nhanh nhất vì sử dụng ngôn ngữ xây dựng foreach thay vì gọi hàm (đắt tiền hơn). designcise.com/web/tutorial/ trộm
Ildar Amankulov

19

Từ những người trợ giúp của Laravel :

function head($array)
{
    return reset($array);
}

Mảng được truyền theo giá trị cho hàm, reset () ảnh hưởng đến con trỏ bên trong của một bản sao của mảng và nó không chạm vào mảng ban đầu (lưu ý rằng nó trả vềfalse nếu mảng trống).

Ví dụ sử dụng:

$data = ['foo', 'bar', 'baz'];

current($data); // foo
next($data); // bar
head($data); // foo
next($data); // baz

Ngoài ra, đây là một thay thế. Nó rất nhanh, nhưng thú vị hơn. Nó cho phép dễ dàng thay đổi giá trị mặc định nếu mảng trống:

function head($array, $default = null)
{
    foreach ($array as $item) {
        return $item;
    }
    return $default;
}

Đối với bản ghi, đây là một câu trả lời khác của tôi , cho phần tử cuối cùng của mảng.


17

Giữ điều này đơn giản! Có rất nhiều câu trả lời đúng ở đây, nhưng để giảm thiểu tất cả sự nhầm lẫn, hai điều này hoạt động và giảm rất nhiều chi phí:

key($array)lấy khóa đầu tiên của một mảng
current($array)lấy giá trị đầu tiên của một mảng


EDIT:
Về các ý kiến ​​dưới đây. Ví dụ sau sẽ xuất ra:string(13) "PHP code test"

$array = array
(
   '1'           => 'PHP code test',  
   'foo'         => 'bar', 5 , 5 => 89009, 
   'case'        => 'Random Stuff: '.rand(100,999),
   'PHP Version' => phpversion(),
   0             => 'ending text here'
);

var_dump(current($array));

11
Ừm currentbằng phần tử hiện tại. Bạn phải đặt lại con trỏ về đầu của mảng để đảm bảo nó thực sự ở đầu.
waterloomatt

current () sẽ lấy phần tử hiện tại, không phải phần tử đầu tiên. Nó khác nhau.
Amirhossein Tarmast

hiện tại sẽ hoạt động nếu chỉ có một phần tử trong mảng.
Zameer Fouzan


14

Tôi sẽ làm gì echo current($array).


1
@hsz Không quan trọng, current()không có lỗi khi không tham chiếu được thông qua. Với điều kiện là con trỏ vẫn ở đầu, nó hoạt động.
Dan Lugg

nhưng nó tạo ra một Thông báo làm cho nhật ký của bạn bị bẩn và ... bạn cũng nên loại bỏ Thông báo nếu chúng không quan trọng
dmikam

1
@dmikam không, không. Trên thực tế resettạo ra thông báo "Chỉ các biến nên được chuyển qua tham chiếu" trong khi currentkhông: Ví dụ về Trình soạn thảo PHP trực tuyến củacurrent(array_filter(...)); .
CPHPython

@CPHPython, có vẻ như bạn đã đúng ... có vẻ như tôi đã có ý tưởng về dòng điện từ thời PHP 4 cũ, nơi nó thực sự tạo ra lỗi nghiêm trọng: sandbox.onlinephpfifts.com/code/ . Vấn đề duy nhất tôi thấy khi sử dụng hiện tại là rằng nó không đảm bảo rằng phần tử được trả về là phần tử đầu tiên của một mảng (con trỏ bên trong có thể được sửa đổi bởi hàm được gọi). Hầu như nó có thể trả về phần tử ngẫu nhiên của một mảng.
dmikam

1
@CPHPython Một cắn dụ nhân tạo, nhưng nó thể hiện tốt những suy nghĩ của tôi: sandbox.onlinephpfunctions.com/code/... chỉ tưởng tượng rằng bạn nhận mảng của bạn từ một số chức năng mà sử dụng next(), end()hoặc bất kỳ chức năng khác mà con trỏ nội Sửa mảng. Trong ví dụ của tôi, current()trả về null vì con trỏ bên trong "nằm ngoài phạm vi" của mảng. Nhưng nó cũng có thể 'hầu như' chỉ đến bất kỳ yếu tố / ngẫu nhiên nào.
dmikam

13
$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
foreach($arr as $first) break;
echo $first;

Đầu ra:

apple

10
$myArray = array (4 => 'apple', 7 => 'orange', 13 => 'plum');
$arrayKeys = array_keys($myArray);

// The first element of your array is:
echo $myArray[$arrayKeys[0]];

Tôi đã không đi theo cách nó được mô tả trong câu trả lời được chấp nhận. Đã sử dụng lời cảm ơn của bạn
JayKandari

9
$array=array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

$firstValue = each($array)[1];

Đây là hiệu quả hơn array_values()each()chức năng không sao chép toàn bộ mảng.

Để biết thêm thông tin, hãy xem http://www.php.net/manual/en/feft.each.php


because the each() function does not copy the entire array.+1

2
Nhưng điều quan trọng là bạn nên thực hiện thiết lập lại trước đó, nếu con trỏ bên trong không ở đầu, bạn sẽ không nhận được phần tử đầu tiên.
Carlos Goce

Nhưng mỗi () nhận được một mảng bằng cách tham chiếu và yêu cầu của các câu hỏi ban đầu là không được làm như vậy
dmikam

8

Một cách đơn giản là:

$foo = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

function get_first ($foo) {
    foreach ($foo as $k=>$v){
        return $v;
    }
}

print get_first($foo);

3
Ít nhất bạn thành thật - đó là bùn! Nhưng, nó hoạt động và tôi đã sử dụng nó trong quá khứ cho đến khi học kỹ thuật list () ở trên.
Random_user_name

1
Nếu bạn đang làm điều này, bạn cũng có thể sử dụng reset()như con trỏ mảng được đặt lại trước khi foreachđược gọi bằng mọi cách.
Tyzoid

7

Lấy phần tử đầu tiên:

array_values($arr)[0]

Lấy phần tử cuối cùng

array_reverse($arr)[0]

Các khóa số được bảo toàn bằng mảng numverse, do đó vẫn sẽ trả về phần tử đầu tiên. 3v4l.org/2729s
Đừng hoảng sợ

7

Hầu hết các công việc này! NHƯNG cho một cuộc gọi nhanh chóng (tài nguyên thấp):

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo $array[key($array)];

// key($array) -> will return the first key (which is 4 in this example)

Mặc dù điều này hoạt động tốt và tốt, nhưng vui lòng xem câu trả lời bổ sung của tôi: https://stackoverflow.com/a/48410351/1804013


5
Điều này tương đương với việc sử dụng current($array), đòi hỏi con trỏ bên trong của mảng phải ở phần tử đầu tiên, trong trường hợp echo reset($array)này là phù hợp nhất.
Tyzoid

@Tyzoid anh ấy thực sự đã viết một câu trả lời khác ở đây với đề nghị của bạn , nhưng anh ấy đã bỏ qua lời giải thích của bạn ... Cảm ơn bạn.
CPHPython

@Tyzoid: Tôi đã thực hiện một câu trả lời / cập nhật thêm một lúc nữa: stackoverflow.com/a/48410351/1804013
tfont

5

Tôi nghĩ rằng sử dụng mảng_values sẽ là lựa chọn tốt nhất của bạn ở đây. Bạn có thể trả về giá trị ở chỉ số 0 từ kết quả của hàm đó để lấy 'apple'.


5

Điều này hơi muộn với trò chơi, nhưng tôi đã gặp phải một vấn đề trong đó mảng của tôi chứa các phần tử mảng khi còn nhỏ bên trong nó, và do đó tôi không thể có được biểu diễn chuỗi của phần tử mảng đầu tiên. Bằng cách sử dụng current()chức năng của PHP , tôi đã quản lý điều này:

<?php
    $original = array(4 => array('one', 'two'), 7 => array('three', 'four'));
    reset($original);  // to reset the internal array pointer...
    $first_element = current($original);  // get the current element...
?>

Cảm ơn tất cả các giải pháp hiện tại đã giúp tôi có được câu trả lời này, tôi hy vọng điều này sẽ giúp được ai đó!


4

Sử dụng:

$first = array_slice($array, 0, 1);  
$val= $first[0];

Theo mặc định, array_slicekhông bảo toàn các khóa, vì vậy chúng ta có thể sử dụng zero một cách an toàn làm chỉ mục.


4

Hai giải pháp cho bạn.

Giải pháp 1 - Chỉ cần sử dụng phím. Bạn đã không nói rằng bạn không thể sử dụng nó. :)

<?php
    // Get the first element of this array.
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Gets the first element by key
    $result = $array[4];

    // Expected result: string apple
    assert('$result === "apple" /* Expected result: string apple. */');
?>

Giải pháp 2 - mảng_flip () + key ()

<?php
    // Get first element of this array. Expected result: string apple
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Turn values to keys
    $array = array_flip($array);

    // You might thrown a reset in just to make sure
    // that the array pointer is at the first element.
    // Also, reset returns the first element.
    // reset($myArray);

    // Return the first key
    $firstKey = key($array);

    assert('$firstKey === "apple" /* Expected result: string apple. */');
?>

Giải pháp 3 - mảng_keys ()

echo $array[array_keys($array)[0]];

2

Đây không phải là phản ứng đơn giản trong thế giới thực. Giả sử rằng chúng tôi có những ví dụ về các phản hồi có thể có mà bạn có thể tìm thấy trong một số thư viện.

$array1 = array();
$array2 = array(1,2,3,4);
$array3 = array('hello'=>'world', 'foo'=>'bar');
$array4 = null;

var_dump('reset1', reset($array1));
var_dump('reset2', reset($array2));
var_dump('reset3', reset($array3));
var_dump('reset4', reset($array4)); // Warning

var_dump('array_shift1', array_shift($array1));
var_dump('array_shift2', array_shift($array2));
var_dump('array_shift3', array_shift($array3));
var_dump('array_shift4', array_shift($array4)); // Warning

var_dump('each1', each($array1));
var_dump('each2', each($array2));
var_dump('each3', each($array3));
var_dump('each4', each($array4)); // Warning

var_dump('array_values1', array_values($array1)[0]); // Notice
var_dump('array_values2', array_values($array2)[0]);
var_dump('array_values3', array_values($array3)[0]);
var_dump('array_values4', array_values($array4)[0]); // Warning

var_dump('array_slice1', array_slice($array1, 0, 1));
var_dump('array_slice2', array_slice($array2, 0, 1));
var_dump('array_slice3', array_slice($array3, 0, 1));
var_dump('array_slice4', array_slice($array4, 0, 1)); // Warning

list($elm) = $array1; // Notice
var_dump($elm);
list($elm) = $array2;
var_dump($elm);
list($elm) = $array3; // Notice
var_dump($elm);
list($elm) = $array4;
var_dump($elm);

Giống như bạn có thể thấy, chúng tôi có một số giải pháp "một dòng" hoạt động tốt trong một số trường hợp, nhưng không phải tất cả.

Theo tôi, bạn nên xử lý chỉ với mảng.

Bây giờ nói về hiệu suất, giả sử rằng chúng ta luôn luôn mảng, như thế này:

$elm = empty($array) ? null : ...($array);

...you would use without errors:
$array[count($array)-1];
array_shift
reset
array_values
array_slice

array_shiftnhanh hơn reset, nhanh hơn [đếm () - 1] và ba cái này nhanh hơn array_valuesarray_slice.


2

Tôi tưởng tượng tác giả chỉ đang tìm cách lấy phần tử đầu tiên của một mảng sau khi lấy nó từ một số hàm ( ví dụ: mysql_fetch_row ) mà không tạo ra một chuỗi "Chỉ các biến được truyền qua tham chiếu".

Nếu đúng như vậy, gần như tất cả các cách được mô tả ở đây sẽ nhận được thông báo này ... và một số trong số chúng sử dụng rất nhiều bộ nhớ bổ sung nhân đôi một mảng (hoặc một phần của nó). Một cách dễ dàng để tránh nó chỉ là gán giá trị nội tuyến trước khi gọi bất kỳ hàm nào trong số đó:

$first_item_of_array = current($tmp_arr = mysql_fetch_row(...));
// or
$first_item_of_array = reset($tmp_arr = func_get_my_huge_array());

Bằng cách này, bạn không nhận được thông báo STRICT trên màn hình, cũng như trong nhật ký và bạn không tạo thêm bất kỳ mảng nào. Nó hoạt động với cả mảng được lập chỉ mục và kết hợp .


1

Tôi thích ví dụ "danh sách", nhưng "danh sách" chỉ hoạt động ở phía bên trái của bài tập. Nếu chúng ta không muốn gán một biến, chúng ta sẽ buộc phải tạo một tên tạm thời, điều này làm ô nhiễm tốt nhất phạm vi của chúng ta và tệ nhất là ghi đè lên một giá trị hiện có:

list($x) = some_array();
var_dump($x);

Ở trên sẽ ghi đè lên bất kỳ giá trị hiện tại nào của $ x và biến $ x sẽ tồn tại chừng nào phạm vi này hoạt động (kết thúc chức năng / phương thức này hoặc mãi mãi nếu chúng ta ở cấp cao nhất). Điều này có thể được giải quyết bằng cách sử dụng call_user_func và một hàm ẩn danh, nhưng thật rắc rối:

var_dump(call_user_func(function($arr) { list($x) = $arr; return $x; },
                        some_array()));

Nếu chúng ta sử dụng các hàm ẩn danh như thế này, chúng ta thực sự có thể thoát khỏi thiết lập lại và Array_shift, mặc dù chúng sử dụng tham chiếu qua. Điều này là do việc gọi một hàm sẽ liên kết các đối số của nó và các đối số này có thể được truyền bằng tham chiếu:

var_dump(call_user_func(function($arr) { return reset($arr); },
                        array_values(some_array())));

Tuy nhiên, điều này thực sự quá mức cần thiết, vì call_user_func sẽ thực hiện nhiệm vụ tạm thời này trong nội bộ. Điều này cho phép chúng tôi xử lý các hàm chuyển qua tham chiếu như thể chúng là từng giá trị, không có bất kỳ cảnh báo hoặc lỗi nào:

var_dump(call_user_func('reset', array_values(some_array())));

1

Một thay đổi nhỏ đối với những gì Sarfraz đăng là:

$array = array(1, 2, 3, 4, 5);
$output = array_slice($array, 0, 1);
print_r ($output);

1

Tôi không thích nghịch với con trỏ bên trong của mảng, nhưng cũng không hiệu quả khi xây dựng một mảng thứ hai bằng array_keys()hoặc array_values(), vì vậy tôi thường định nghĩa điều này:

function array_first(array $f) {
    foreach ($f as $v) {
        return $v;
    }
    throw new Exception('array was empty');
}

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.