Jak mogę uzyskać ostatni klucz tablicy?
Jak mogę uzyskać ostatni klucz tablicy?
Odpowiedzi:
Rozwiązaniem byłoby użycie kombinacji end
i (cytowanie) :key
end()
przesuwa wewnętrzny wskaźnik tablicy do ostatniego elementu i zwraca jego wartość. key()
zwraca element indeksu bieżącej pozycji tablicy. Tak więc część kodu, taka jak ta, powinna załatwić sprawę:
$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);
Wyjdzie:
string 'last' (length=4)
tzn. klucz ostatniego elementu mojej tablicy.
Po wykonaniu tej czynności wewnętrzny wskaźnik tablicy znajdzie się na końcu tablicy. Jak wskazano w komentarzach, możesz chcieć uruchomić reset()
tablicę, aby wskaźnik powrócił na początek tablicy.
reset()
) ;; ale masz rację wskazując tę funkcję, która może być przydatna.
array('a', 'b', 'c', 'd', 'a')
powróci klawisz 0 zamiast 4.
Choć end()
wydaje się najłatwiejszy, nie jest najszybszy. Szybsza i znacznie silniejsza alternatywa to array_slice()
:
$lastKey = key(array_slice($array, -1, 1, true));
Jak mówią testy , w macierzy z 500 000 elementów jest prawie 7 razy szybsza!
end($arr);$key = key($arr);reset($arr);
z (b) $key = key(array_slice($arr,-1,1,true));
... co skutkowało end()
DUŻO szybszym! end () = 0,05326 sekund, array_slice = 8.506 sekund ... huh ??
end()
jest najszybszy, ponieważ można go wyprowadzić z bardzo prostej funkcji C, takiej jak:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
last
do ostatniego elementu. Robienie end()
prawie O (1). :-)
wolę
end(array_keys($myarr))
end((array_keys($myarr)))
aby obejść ogłoszenie.
Od PHP 7.3 (2018) jest (wreszcie) funkcja do tego: http://php.net/manual/en/function.array-key-last.php
$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )
wyjdzie
orange
Po prostu użyj : echo $array[count($array) - 1];
int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
która jest ciekawe, ale nie dobre dla biznesu, gdy masz ograniczony czas
$a[1] = 1; $a[5] = 5; $a[0] = 0;
, będziesz mieć tablicę z kluczami (1, 5, 0), w tej kolejności. count($a)
da 3 i $a[2]
nie jest zdefiniowany. Z pewnością nie daje ci 5 z powrotem.
Nie wiem, czy będzie to szybsze, czy nie, ale wydaje się, że łatwiej jest to zrobić w ten sposób i można uniknąć błędu, nie przekazując funkcji do końca () ...
potrzebna była tylko zmienna ... nic wielkiego, aby napisać jeszcze jedną linię kodu, a następnie ją rozbroić, jeśli zajdzie taka potrzeba.
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
$keys = array_keys($array);
$last = end($keys);
Od wersji PHP 7.3 możesz bezpośrednio uzyskać dostęp do ostatniego klucza w (zewnętrznym poziomie) tablicy za pomocą array_key_last ()
Ostatecznie większość debaty na tej stronie leży w łóżku. Jest bezkonkurencyjny, osiąga najlepsze wyniki, nie odczuwa żadnych skutków ubocznych i jest bezpośrednią, intuicyjną techniką pojedynczego połączenia, która zapewnia dokładnie to, czego szuka to pytanie.
Szorstki wzorzec jako dowód: https://3v4l.org/hO1Yf
array_slice() + key(): 1.4 end() + key(): 13.7 array_key_last(): 0.00015
* tablica testowa zawiera 500000 elementów, mikrotime powtórzone 100x, następnie uśrednione, a następnie pomnożone przez 1000, aby uniknąć notacji naukowej. Podziękowania dla @MAChitgarha za wstępny test porównawczy skomentowany pod odpowiedzią @ TadejMagajna .
Oznacza to, że możesz pobrać wartość ostatniego klucza bez:
Ta funkcja była od dawna spóźniona i jest mile widzianym dodatkiem do paska narzędzi funkcji tablicy, który poprawia wydajność, pozwala uniknąć niepożądanych efektów ubocznych i umożliwia czysty / bezpośredni / intuicyjny kod.
Oto 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);
}
Wynik:
First Key: a
Last Key: c // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c // <-- unaffected by the pointer position, NICE!
Niektóre uwagi:
array_key_last()
jest funkcją rodzeństwa array_key_first () .null
jeśli tablica jest pusta.array_value_first()
& array_value_last()
) również zaoferowałyby nieświadomy wskaźnik dostępu do elementów bookend, ale najwyraźniej nie udało im się zdobyć wystarczającej liczby głosów, aby ożywić.Oto kilka odpowiednich stron omawiających nowe funkcje:
ps Jeśli ktoś zastanawia się nad innymi technikami, możesz odnieść się do tego małego zbioru porównań: ( Demo )
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
Spróbuj użyć funkcji array_pop i array_keys w następujący sposób:
<?php
$array = array(
'one' => 1,
'two' => 2,
'three' => 3
);
echo array_pop(array_keys($array)); // prints three
?>
array_pop()
działa na wartości zwracanej, array_keys()
a nie na oryginalnej tablicy.
Począwszy od PHP> = 7.3 array_key_last()
jest najlepszym sposobem na uzyskanie ostatniego klucza z dowolnej tablicy. Korzystanie z kombinacji end()
, key()
a reset()
tylko po to żeby ostatni klucz tablicy jest oburzające.
$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3
porównaj to do
end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)
Jeśli używasz kombinacji end()
i, musisz zresetować tablicę, aby wskaźnik znajdował się na początkukey()
Chciałbym również zaoferować alternatywne rozwiązanie tego problemu.
Zakładając, że wszystkie twoje klucze są numeryczne bez żadnych luk, moją preferowaną metodą jest policzenie tablicy, a następnie minus 1 od tej wartości (aby uwzględnić fakt, że klucze tablicy zaczynają się od 0.
$array = array(0=>'dog', 1=>'cat');
$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];
var_dump($lastKey);
print_r($lastKeyValue);
To dałoby ci:
int (1) cat
Możesz użyć tego:
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array);
echo key($array);
Innym rozwiązaniem jest utworzenie funkcji i użycie jej:
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
Spróbuj tego z array_reverse()
.
$arr = array(
'first' => 01,
'second' => 10,
'third' => 20,
);
$key = key(array_reverse($arr));
var_dump($key);
$array = array(
'something' => array(1,2,3),
'somethingelse' => array(1,2,3,4)
);
$last_value = end($array);
$last_key = key($array); // 'somethingelse'
Działa to, ponieważ PHP przenosi wewnętrznie wskaźnik tablicy dla $ array
Najlepsze możliwe rozwiązanie, które można zastosować również w linii:
end($arr) && false ?: key($arr)
To rozwiązanie jest tylko wyrażeniem / stwierdzeniem i zapewnia dobre, a nie najlepszą możliwą wydajność.
Wstawione przykładowe użycie:
$obj->setValue(
end($arr) && false ?: key($arr) // last $arr key
);
AKTUALIZACJA: W PHP 7.3+: użyj (oczywiście) nowo dodanej array_key_last()
metody.