Come posso ottenere l'ultima chiave di un array?
Come posso ottenere l'ultima chiave di un array?
Risposte:
Una soluzione sarebbe quella di utilizzare una combinazione di end
e (citazione) :key
end()
fa avanzare il puntatore interno dell'array all'ultimo elemento e ne restituisce il valore. key()
restituisce l'elemento indice della posizione corrente dell'array. Quindi, una parte di codice come questa dovrebbe fare il trucco:
$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);
Uscita:
string 'last' (length=4)
cioè la chiave dell'ultimo elemento del mio array.
Al termine, il puntatore interno dell'array si troverà alla fine dell'array. Come sottolineato nei commenti, potresti voler eseguire reset()
l'array per riportare il puntatore all'inizio dell'array.
reset()
) ;; ma hai ragione nel puntare quella funzione, che potrebbe essere utile.
array('a', 'b', 'c', 'd', 'a')
restituirà la chiave 0 anziché 4.
Anche se end()
sembra essere il più semplice, non è il più veloce. L'alternativa più veloce e molto più forte è array_slice()
:
$lastKey = key(array_slice($array, -1, 1, true));
Come dicono i test , su un array con 500000 elementi, è quasi 7 volte più veloce!
end($arr);$key = key($arr);reset($arr);
con (b) $key = key(array_slice($arr,-1,1,true));
... risultando end()
MOLTO più veloce! end () = 0,05326 secondi, array_slice = 8.506 secondi ... eh ??
end()
è più veloce perché può essere derivato da una funzione C molto semplice, come ad esempio:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
last
all'ultimo elemento. Facendo end()
praticamente O (1). :-)
preferisco
end(array_keys($myarr))
end((array_keys($myarr)))
per aggirare l'avviso.
Da PHP 7.3 (2018) esiste (finalmente) una funzione per questo: http://php.net/manual/en/function.array-key-last.php
$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )
uscirà
orange
Usa solo: echo $array[count($array) - 1];
int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
che è interessante ma non buono per gli affari quando hai un budget limitato
$a[1] = 1; $a[5] = 5; $a[0] = 0;
Quindi si avrà un array con le chiavi (1, 5, 0), in questo ordine. count($a)
produrrà 3 e $a[2]
non è definito. Certamente non ti restituisce 5.
Non so se questo sarà più veloce o meno, ma sembra più facile farlo in questo modo ed eviti l'errore non passando una funzione a end () ...
aveva solo bisogno di una variabile ... non è un grosso problema per scrivere un'altra riga di codice, quindi disinserirla se necessario.
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
$keys = array_keys($array);
$last = end($keys);
A partire da PHP7.3 puoi accedere direttamente all'ultima chiave (il livello esterno di) un array con array_key_last ()
Mette definitivamente a dura prova gran parte del dibattito in questa pagina. È senza dubbio il miglior esecutore, non subisce effetti collaterali ed è una tecnica diretta, intuitiva, a chiamata singola per fornire esattamente ciò che questa domanda cerca.
Un punto di riferimento approssimativo come prova: https://3v4l.org/hO1Yf
array_slice() + key(): 1.4 end() + key(): 13.7 array_key_last(): 0.00015
* l'array di test contiene 500000 elementi, microtime ripetuto 100x quindi mediato quindi moltiplicato per 1000 per evitare la notazione scientifica. Ringraziamo @MAChitgarha per il benchmark iniziale commentato nella risposta di @ TadejMagajna .
Ciò significa che puoi recuperare il valore della chiave finale senza:
Questa funzione era attesa da tempo e una gradita aggiunta alla cintura degli strumenti della funzione array che migliora le prestazioni, evita effetti collaterali indesiderati e consente codice pulito / diretto / intuitivo.
Ecco una 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);
}
Produzione:
First Key: a
Last Key: c // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c // <-- unaffected by the pointer position, NICE!
Alcune note:
array_key_last()
è la funzione di pari livello di array_key_first () .null
se l'array è vuoto.array_value_first()
& array_value_last()
) avrebbero offerto agli ignoranti un accesso puntatore-ignorante agli elementi, ma evidentemente non sono riuscite a ottenere voti sufficienti per prendere vita.Ecco alcune pagine pertinenti che parlano delle nuove funzionalità:
ps Se qualcuno sta valutando alcune delle altre tecniche, puoi fare riferimento a questa piccola raccolta di confronti: ( 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
Prova a utilizzare la funzione array_pop e array_keys come segue:
<?php
$array = array(
'one' => 1,
'two' => 2,
'three' => 3
);
echo array_pop(array_keys($array)); // prints three
?>
array_pop()
opera sul valore restituito array_keys()
e non sull'array originale.
A partire da PHP> = 7.3 array_key_last()
è il modo migliore per ottenere l'ultima chiave di uno qualsiasi di un array. Utilizzando combinazione di end()
, key()
e reset()
solo per ottenere ultima chiave di un array è scandaloso.
$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3
confrontalo con
end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)
È necessario reimpostare l'array affinché il puntatore sia all'inizio se si utilizza la combinazione di end()
ekey()
Vorrei anche offrire una soluzione alternativa a questo problema.
Supponendo che tutte le chiavi siano numeriche senza spazi vuoti, il mio metodo preferito è contare l'array quindi meno 1 da quel valore (per tenere conto del fatto che le chiavi dell'array iniziano da 0.
$array = array(0=>'dog', 1=>'cat');
$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];
var_dump($lastKey);
print_r($lastKeyValue);
Questo ti darebbe:
int (1) cat
Puoi usare questo:
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array);
echo key($array);
Un'altra soluzione è creare una funzione e usarla:
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
Prova questo con 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'
Questo funziona perché PHP sposta internamente il puntatore dell'array per $ array
La migliore soluzione possibile che può essere utilizzata anche in linea:
end($arr) && false ?: key($arr)
Questa soluzione è solo espressione / affermazione e garantisce che non sia la migliore prestazione possibile.
Esempio di utilizzo in linea:
$obj->setValue(
end($arr) && false ?: key($arr) // last $arr key
);
AGGIORNAMENTO: In PHP 7.3+: usa (ovviamente) il array_key_last()
metodo appena aggiunto .