2010-07-18 13 views
46

Es ist so einfach wie der Titel klingt; Ich muss den Index/Schlüssel des zuletzt eingefügten Artikels bekommen. Warum ist das schwierig? Auch die folgenden zwei Codebeispiele:PHP Index des zuletzt eingefügten Elements in Array erhalten

$a=array(); 
echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>'; 
echo 'res='.($a[]='bbb').' - '.(count($a)-1).'<br>'; 
echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>'; 
die('<pre>'.print_r($a,true).'</pre>'); 

Schreibt:

res=aaa - 0 
res=bbb - 1 
res=aaa - 2 
Array (
    [0] => aaa 
    [1] => bbb 
    [2] => aaa 
) 

Sicher, das scheint gut zu funktionieren, aber sehen:

$a=array(); 
echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>'; 
echo 'res='.($a[2]='bbb').' - '.(count($a)-1).'<br>'; 
echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>'; 
die('<pre>'.print_r($a,true).'</pre>'); 

Schreibt:

res=aaa - 0 
res=bbb - 1  <- wrong! 
res=aaa - 2  <- wrong! 
Array (
    [0] => aaa 
    [2] => bbb <- real key 
    [3] => aaa <- real key 
) 

Kurz gesagt, die beliebte Problemumgehung count($array)-1 ist fehlerhaft.

Antwort

61

Hier ist eine linear (schnellste) Lösung:

end($a); 
$last_id=key($a); 
+1

Dies ist in der Tat schneller. – Christian

+1

Schöne! Ist 'end ($)' notwendig, wenn Sie '[]' verwenden? Ich habe bemerkt, dass es auch ohne es funktioniert –

+2

Leider ist es das. Ein einfacher Test zeigt, dass die '$ array [] = $ value;' Operation den internen Zeiger des Arrays nicht am Ende davon setzt bleibt bei der letzten 'reset',' next', 'end' oder ähnlichen Operation gesetzt oder an der Position 0 wenn es ein neues Array mit neuen Werten ist – SWilk

18

Sie können die Funktion end() verwenden, um das letzte Element in einem Array abzurufen, und array_keys(), um ein Array der Array-Schlüssel zurückzugeben. Verwirrend. In der Praxis funktioniert es so:

$key = end(array_keys($array)); 

Credit geht an Hollsk in den Kommentaren.

+0

, die den Wert zurückgibt, der Index nicht. Bei einem Array mit mehreren nicht eindeutigen Werten kann dies nicht funktionieren. – Christian

+6

Natürlich kann es. $ key = end (array_keys ($ array)); – hollsk

+8

-1 Sie sollten keinen Wert an "end" übergeben. Dies wirft eine strenge Warnung auf. Die richtige Antwort ist diejenige von Volkerk: 'end ($ array); Schlüssel ($ array); '. – Artefacto

1

Bah, sieht aus wie ich die Antwort von mir gefunden habe:

$last_id = array_pop(array_keys($a)); 
+0

Sind Sie sicher, dass Sie das wollen? array_pop wird das Element aus dem Array entfernen und dann seinen Wert zurückgeben, was vielleicht nicht hilfreich ist, wenn Sie später das komplette Array für etwas anderes benötigen. end with array_keys wird tun, was Sie wollen, während Sie Ihr Array unbelästigt lassen. – hollsk

+0

Das funktioniert auf einem anderen Array als $ a. array_keys() gibt ein neues Array zurück, und ich kann damit machen, was ich will, da dieses Array komplett temporär ist. Vielleicht solltest du die Dokumentation zu array_keys() lesen? – Christian

+1

Dies löst eine 'E_STRICT' Nachricht aus, da' array_pop() 'eine Variable benötigt, die als Referenz übergeben wird. – MrWhite

2

Wenn Sie nur mit numerischem Indizes für das Array, das letzte automatisch generierten Index wird immer arbeiten sein der größte Array Schlüssel das Array.

Also, für automatisch generierte Indizes, sollte etwas wie max(array_keys($a)) funktionieren.

Zum Beispiel diese:

$a=array(); 
echo 'res='.($a[]='aaa').' - '.(max(array_keys($a))).'<br>'; 
echo 'res='.($a[2]='bbb').' - '.(max(array_keys($a))).'<br>'; 
echo 'res='.($a[]='aaa').' - '.(max(array_keys($a))).'<br>'; 
die('<pre>'.print_r($a,true).'</pre>'); 

Würden Sie erhalten:

res=aaa - 0 
res=bbb - 2 
res=aaa - 3 

Array 
(
    [0] => aaa 
    [2] => bbb 
    [3] => aaa 
) 


Aber beachten Sie, dass dies nicht für Situationen arbeiten, wenn Sie die eine Angabe des Index sind ...

+0

Deshalb habe ich das zweite Beispiel angegeben. Ich habe klar gesagt, dass es die Möglichkeit gibt, dass Schlüssel gesetzt werden, ganzzahlig oder nicht. Sorry, viel Glück beim nächsten Mal ;-) – Christian

+0

Nun, es funktioniert, mit deinem zweiten Beispiel ;-) ;; aber, OK, es funktioniert nur, weil Sie einen numerischen Index mit dem "richtigen" Wert hinzugefügt haben :-( –

19

Sie können key($a) zusammen mit end($a)

verwenden
$a=array(); 
$a[]='aaa'; foo($a); 
$a[3]='bbb'; foo($a); 
$a['foo']='ccc'; foo($a); 
$a[]='ddd'; foo($a); 

function foo(array $a) { 
    end($a); 
    echo 'count: ', count($a), ' last key: ', key($a), "\n"; 
} 

druckt

count: 1 last key: 0 
count: 2 last key: 3 
count: 3 last key: foo 
count: 4 last key: 4 
1

Auf Arrays mit numerischen Tasten von 0 bis n-1 habe ich immer verwenden:

$key = array_push($array, $value)-1; 

Es wird nicht ein Ich denke schneller oder einfacher. Wenn jemand etwas hat, das für andere Arrays funktioniert, lass es mich wissen.

+0

Er ... lesen Sie einfach die anderen Antworten .. – Christian

+1

Ich weiß, dass es nicht Ihren speziellen Bedürfnissen entspricht, aber ich kam hier von Google suchen und dachte, jemand anderes käme auf dieselbe Weise hierher gepachtet, um es zu finden;) – Christoph

+1

-1 Diese Antwort ist falsch. 'array_push' gibt die neue ** Anzahl ** von Elementen im Array zurück. Ihre Methode funktioniert nur, wenn keine Schlüssel fehlen. – Twifty

0

Wenn Sie möchten, dass der Index nur das zuletzt eingefügte Element enthält.

eine Funktion verwenden, benutzen Sie einfach:

return $array[] = $value; 
+0

Das geht nicht, wie mein Beispielcode oben zeigt. Dieser Ausdruck gibt den Wert zurück, nicht den Schlüssel. Ich habe es auch ausprobiert, falls mir etwas fehlt: https://3v4l.org/96q2t – Christian

Verwandte Themen