Array Key neu vergeben

david07

Mitglied
Hi,

habe ein Problem:

Bekomme über ein Formular folgendes Array zurück:

Array
(
[0] => 45
[4] => 56
[7] => 39
)

nachdem ich das array mit array_filter() gesäubert habe.

Nun brauch ich aber zur Weiterverarbeitung sabere key also:

Array
(
[0] => 45
[1] => 56
[2] => 39
)

Ich habe das schonmal gemacht. Soweit ich mich erinnere gab es da eine Funktion. Ich komme aber nicht mehr drauch und finde sie auch nicht mehr.

Kann mir da schnell jemand weiter helfen?

Vielen Dank!
David
 
Wo ich grad in dem PHP-Manual auf der Seite bin sehe ich array_fill:
PHP:
$a = array_fill(0, count($altesArray), $altesArray);

Oder besser:
PHP:
$a = array_values($altesArray);

Gibt aber bestimmt noch eine bessere Variante.
 
Hi,

vielen Dank!!

array_values() war es :)

das hatte ich gesucht.

So funktioniert es jetzt:

PHP:
$colors = array_values(array_filter($_POST["color"]));

Danke!
 
So ist es schneller:
PHP:
$colors = array_filter($_POST["color"]);
$colors = array_values($colors);

Weil sonst fragt array_values nach dem ersten und dann läuft array_filter einmal durch und liefert das erste, dann fragt array_values nach dem zweiten und array_filter läuft wieder und wieder.

So oder so ungefähr ;) auf jeden Fall brauch die Funktion in der Funktion immer länger.
 
So ist es schneller:
PHP:
$colors = array_filter($_POST["color"]);
$colors = array_values($colors);

Weil sonst fragt array_values nach dem ersten und dann läuft array_filter einmal durch und liefert das erste, dann fragt array_values nach dem zweiten und array_filter läuft wieder und wieder.

So oder so ungefähr ;) auf jeden Fall brauch die Funktion in der Funktion immer länger.
Hast du dafür auch eine Quelle? Wäre mir jetzt neu, dass PHP diese Art der lazy evaluation unterstützt.

Grüße,
Matthias
 
Insbesondere "Lazy Evaluation" war damit nicht direkt gemeint, eigentlich dass PHP sich sicherlich so verhalten wird, wie bei der vorausberechneten Länge eines Arrays für eine for-Schleife, statt das ganze jedesmal neu zu berechnen: http://phpperformance.de/zaehlschleife-so-oft-durchfuehren-wie-ein-array-eintraege-hat/

PHP:
for ($i = 0; $i < count($array); $i++)
// langsamer als
$laenge = count($array);
for ($i = 0; $i < $laenge; $i++)

array_filter übergibt selbstverständlich das ganze Array an array_values, aber array_values nimmt das erste für das neue Array und holt sich dann das zweite. Daraus habe ich geschlossen, dass die Funktion in der Funktion eher langsamer ist als die separate Ausführung und Ergebnis in einer Variablen speichern.
 
array_filter übergibt selbstverständlich das ganze Array an array_values, aber array_values nimmt das erste für das neue Array und holt sich dann das zweite. Daraus habe ich geschlossen, dass die Funktion in der Funktion eher langsamer ist als die separate Ausführung und Ergebnis in einer Variablen speichern.
Ich glaube damit liegst du falsch. Bei array_values(array_filter($a)); wird ja nicht der Ausdruck array_filter($a) an array_values übergeben, sondern der Ausdruck wird ausgewertet und das Ergebnis (temporäres Array) an array_values übergeben. array_filter wird also nur genau einmal aufgerufen. Das kann man auch leicht testen, indem man sich selber eine Funktion schreibt, die einen Nebeneffekt hat (z.B. Ausgabe via echo) und diese in einen Aufruf von array_values schachtelt. Man wird feststellen, dass die Ausgabe nur einmal erscheint, die Funktion also tatsächlich nur ein einziges mal aufgerufen wurde.

Grüße,
Matthias
 
Zurück