Gdybym miał tablicę taką jak:
$array['foo'] = 400;
$array['bar'] = 'xyz';
I chciałem wydobyć pierwszy element z tej tablicy, nie znając klucza, jak mam to zrobić? Czy jest do tego funkcja?
Gdybym miał tablicę taką jak:
$array['foo'] = 400;
$array['bar'] = 'xyz';
I chciałem wydobyć pierwszy element z tej tablicy, nie znając klucza, jak mam to zrobić? Czy jest do tego funkcja?
Odpowiedzi:
reset()
podaje pierwszą wartość tablicy, jeśli wewnątrz tablicy znajduje się element:
$value = reset($array);
Podaje również FALSE
w przypadku, gdy tablica jest pusta.
$arr = array(/* stuff */); $val = $arr? reset($arr): /* value to indicate array is empty */;
Jeśli nie wiesz wystarczająco dużo o tablicy (nie jesteś pewien, czy pierwszy klucz to foo czy bar ), to tablica może być również pusta .
Dlatego najlepiej byłoby to sprawdzić, zwłaszcza jeśli istnieje szansa, że zwrócona wartość może być logiczną FAŁSZ:
$value = empty($arr) ? $default : reset($arr);
Powyższy kod używa reset
i ma efekty uboczne (resetuje wewnętrzny wskaźnik tablicy), więc możesz preferować użycie array_slice
do szybkiego dostępu do kopii pierwszego elementu tablicy:
$value = $default;
foreach(array_slice($arr, 0, 1) as $value);
Zakładając, że chcesz uzyskać osobno klucz i wartość , musisz dodać czwarty parametr do array_slice
:
foreach(array_slice($arr, 0, 1, true) as $key => $value);
Aby otrzymać pierwszą pozycję jako parę ( key => value
):
$item = array_slice($arr, 0, 1, true);
Prosta modyfikacja, aby uzyskać osobno ostatni element, klucz i wartość:
foreach(array_slice($arr, -1, 1, true) as $key => $value);
Jeśli tablica nie jest naprawdę duża, w rzeczywistości nie potrzebujesz array_slice
i możesz raczej uzyskać kopię całej tablicy kluczy, a następnie uzyskać pierwszy element:
$key = count($arr) ? array_keys($arr)[0] : null;
Jeśli jednak masz bardzo dużą tablicę, wywołanie array_keys
będzie wymagało znacznie więcej czasu i pamięci array_slice
(obie funkcje przechodzą przez tablicę, ale ta ostatnia kończy się, gdy tylko zgromadzi wymaganą liczbę elementów - czyli jeden).
Godnym uwagi wyjątkiem jest sytuacja, w której masz pierwszy klucz, który wskazuje na bardzo duży i zawiły obiekt. W takim przypadku array_slice
zduplikuje ten pierwszy duży obiekt, a array_keys
jedynie złapie klucze.
PHP 7.3 implementuje array_key_first()
równieżarray_key_last()
. Są one jawnie udostępniane w celu wydajnego uzyskiwania dostępu do pierwszego i ostatniego klucza bez resetowania stanu wewnętrznego tablicy jako efektu ubocznego.
Więc w PHP 7.3 pierwsza wartość z $array
może być dostępne z
$array[array_key_first($array)];
Nadal lepiej sprawdź, czy tablica nie jest pusta, bo inaczej otrzymasz błąd:
$firstKey = array_key_first($array);
if (null === $firstKey) {
$value = "Array is empty"; // An error should be handled here
} else {
$value = $array[$firstKey];
}
Fałszywa pętla, która zrywa się przy pierwszej iteracji:
$key = $value = NULL;
foreach ($array as $key => $value) {
break;
}
echo "$key = $value\n";
Lub użyj each()
( ostrzeżenie: przestarzałe w PHP 7.2.0 ):
reset($array);
list($key, $value) = each($array);
echo "$key = $value\n";
reset()
Funkcja będzie pobierać tylko pierwszą wartość.
Jest kilka opcji. array_shift()
zwróci pierwszy element, ale usunie również pierwszy element z tablicy.
$first = array_shift($array);
current()
zwróci wartość tablicy, na którą wskazuje wskaźnik pamięci wewnętrznej, która jest domyślnie pierwszym elementem.
$first = current($array);
Jeśli chcesz mieć pewność, że wskazuje na pierwszy element, zawsze możesz użyć reset()
.
reset($array);
$first = current($array);
reset()
rzeczywistości zwraca element, więc śledzenie tego z a $first = current($array)
jest zbędne.
Po prostu mamy kilka innych opcji: reset($arr);
wystarczająco dobre, jeśli nie próbujesz utrzymać wskaźnika tablicy w miejscu, a przy bardzo dużych tablicach powoduje to minimalne obciążenie. To powiedziawszy, są z tym pewne problemy:
$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.
Sposób na zrobienie tego bez zmiany wskaźnika:
$arr[reset(array_keys($arr))]; // OR
reset(array_values($arr));
Zaletą $arr[reset(array_keys($arr))];
jest to, że generuje ostrzeżenie, jeśli tablica jest rzeczywiście pusta.
inny łatwy i prosty sposób, aby to zrobić, użyj wartości_tablicowych
array_values($array)[0]
reset()
jest znacznie lepszą opcją, ponieważ zwraca wartość false, jeśli tablica jest pusta. Twoje rozwiązanie nie zadziała na przykład w pytaniu
array_values($array)[0] ?? FALSE
Możemy zrobić
$first = reset($array);
Zamiast
reset($array);
$first = current($array);
Tak jak reset()
zwraca pierwszy element tablicy po resecie;
Użyj funkcji reset (), aby pobrać pierwszy element z tej tablicy bez znajomości klucza do niej w ten sposób.
$value = array('foo' => 400, 'bar' => 'xyz');
echo reset($value);
wyjście // 400
Możesz tego spróbować.
Aby uzyskać pierwszą wartość tablicy: -
<?php
$large_array = array('foo' => 'bar', 'hello' => 'world');
var_dump(current($large_array));
?>
Aby uzyskać pierwszy klucz tablicy
<?php
$large_array = array('foo' => 'bar', 'hello' => 'world');
$large_array_keys = array_keys($large_array);
var_dump(array_shift($large_array_keys));
?>
Możesz użyć array_shift
Robię to, aby uzyskać pierwszą i ostatnią wartość. Działa to również z większą liczbą wartości.
$a = array(
'foo' => 400,
'bar' => 'xyz',
);
$first = current($a); //400
$last = end($a); //xyz
Począwszy od PHP 7.3.0 można to zrobić bez resetowania wewnętrznego wskaźnika. Użyłbyś array_key_first
. Jeśli jesteś pewien, że twoja tablica ma wartości, możesz po prostu zrobić:
$first = $array[array_key_first($array)];
Bardziej prawdopodobne jest, że będziesz chciał obsłużyć przypadek, w którym tablica jest pusta:
$first = (empty($array)) ? $default : $array[array_key_first($array)];
możesz po prostu użyć $array[0]
. zawsze da ci pierwszy przedmiot