PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Array im selben Arraydurchlauf durchlaufen



msi
18-04-2004, 20:53
Hallo,

ich habe ein Array, welches ich durchlaufe. Nun möchte ich dasselbe Array in dieser Schleife auch durchlaufen, ohne dass ich das gesamte Array kopieren muss.



reset($array);
while ( list(,$a) = each($array)) {
reset($array);
while ( list(,$a) = each($array)) {
..
}
}


das Problem ist, dass der Zähler, der durchläuft nach der inneren Schleife wieder auf den Wert zurückgesetzt werden müsste, den er vor dem reset aufruf in der ersten Schleife hatte. Blos wie mach ich das??
Oder einfach wie in C einen Zeiger benutzen, wie geht das?

danke im Vorraus
Markus

slimie
18-04-2004, 22:06
nabend,


also ich guck ma ob ich dein problem richtig verstanden habe :D sagen wir mal wir haben jetz ein array mit den werten 1, 2, 3, 4 und 5 also


$array = array("1","2","3","4","5");

wenn du jetz den ersten wert also 1 ausliest und dann reset($array) machs wäre beim nächsten mal die ausgabe wieder 1. soweit richtig oder?! naja auf jeden fall wenn ichs richtig verstanden hab willste ja (logischer weise) beim zweiten durchlauf den zweiten wert also die 2 haben.


$array = array("1","2","3","4","5");

foreach ($array as $value) {
echo $value . "<br>\n";
reset($array);
}

wäre dann ja ne endlosschleife oder? naja egal ich bin mir nicht sicher aber auf jeden fall gibts durch das array ständig immer nur den ersten wert. den zweiten kriegt man dann nur raus, indem man quasi "mitteilt" das wir nicht den ersten wert nach dem reset brauchen, sondern den zweiten, den dritten und so weiter.


$array = array("1","2","3","4","5");

for ($i == 0; $i < count($array); $i++) {
if ($i == 0) {
echo current($array);
} else {
for ($i2 == 0; $i2 < $i; $i2++) {
next($array);
$i++;
}
echo current($array);
}
$i++;
}

also irgendwie muss man zählen, wie oft die ganze schose schon durchgegangen ist von den datensätzen die da sind bis er halt am ende angekommen ist. also jedes mal immer einen weiter gehen, wenn er es zum ersten mal durchgeht soll er natürlich den ersten satz nehmen also current($array);... next($array) geht immer einen satz weiter!


reset($array);
next($array);
next($array);

echo current($array);

wäre dann also in diesem beispiel 3. ich weiß jetz nich so genau ob das so funzt, habs nur so eben aus dem kopf geschrieben ich muss nämlich in die heia :D aber selbst wenn es nich klappt, das prinzip ist hoffentlich rüber gekommen oder?

wenn nich und es nich funzt sag noch mal bescheid, ich guck mir das dann morgen nomma an hehe


mfg und gute nacht
jens

Gaert
18-04-2004, 22:56
Hallo,

foreach arbeitet immer mit einer Kopie des Arrays... ein reset() ist daher NICHT nötig!

Die Lösung lautet folglich:



foreach ( $array as $a) {

foreach ( $array as $a) {

..

}
}

PS: RTFM - http://de.php.net/foreach ;)

Gruß,

Gaert

msi
18-04-2004, 23:09
> foreach arbeitet immer mit einer Kopie des Arrays.


msi schrieb:
ich habe ein Array, welches ich durchlaufe. Nun möchte ich dasselbe Array in dieser Schleife auch durchlaufen, ohne dass ich das gesamte Array kopieren muss.

kopieren kann ichs manuel ja auch, aber das will ich eben gerade vermeide, da das Array ziemlich groß werden kann (bei 20 000 einträgen müsste man 20 000mal 20 000 einträge kopieren). Deshalb suche ich ja nach einer Lösung, in der man keine Kopie anlegt.

Ach ja noch was: die Keys des Arrays sind zwar durchnummeriert, aber einige Teile werden nach und nach in der 2. Schleife geunsettet. Also unset $array[$key]; wird durchgeführt. D.h. ich kann auch nicht eine Zahl von 0 bis X hochählen lassen und diese dann als Key benutzen.

Gaert
19-04-2004, 08:02
Hallo msi,

ich habe dein Post schon richtig gelesen, aber ich bin davon ausgegangen, dass es sich um ein Array in "Standardgröße" handelt... Aber ehrlich gesagt glaube ich nicht, dass die Kopie eines Arrays deinerr Größe die Performance eines Skripts merklich beeinflusst - man müsste mal nachschauen wie PHP die Arrays intern behandelt.

Du kannst unter Umständen mit einer Referenz auf das Array arbeiten (echte Pointer gibts in PHP nicht).

Würde dann in etwa so aussehen:


$array_ref &= $array;


Allerdings müsstest du das Array dann wieder vor der Schleife resetten... also im Endeffekt kommst du um eine Kopie nicht herum!

Ohne dir etwas unterstellen zu wollen... möglicherweise ist das Grunddesign deiner Anwendung nich so gelungen!?!
Beschreib doch mal was du eigentlich machen möchtest.

msi
19-04-2004, 09:41
Hallo,

> Ohne dir etwas unterstellen zu wollen... möglicherweise ist das Grunddesign deiner Anwendung nich so gelungen!?!

dabei handelt es sich um eine Berechnung, die grundsätzlich länger dauert. Ich denke nicht, dass das Design schlecht ist.
Zb bei Sortieralgorithmen braucht man doch sowas auch. Und da muss auch drauf verzichtet werden Kopien anzulegen, wo man dies vermeiden kann.

> Beschreib doch mal was du eigentlich machen möchtest.

is ne komplexe Sache, vielleicht wann anderst..

Kann ich vielleicht irgendwie manuell die Position im Array auslesen und diese setzen?

Pingu
19-04-2004, 16:24
Hi,

ist es vielleicht möglich die Verarbeitungsstruktur umzustellen. Notfalls mit Hilfe von speziellen Array-Funktion, wo man eigene Callbacks definieren kann, z. B.:
array_filter() (http://de2.php.net/manual/de/function.array-filter.php)
array_map() (http://de2.php.net/manual/de/function.array-map.php)
array_reduce() (http://de2.php.net/manual/de/function.array-reduce.php)
array_walk() (http://de2.php.net/manual/de/function.array-walk.php)


*nureinfachmalsoindierundewerf*

Pingu

msi
19-04-2004, 16:49
Original geschrieben von Pingu
Hi,

ist es vielleicht möglich die Verarbeitungsstruktur umzustellen. Notfalls mit Hilfe von speziellen Array-Funktion, wo man eigene Callbacks definieren kann, z. B.:
array_filter() (http://de2.php.net/manual/de/function.array-filter.php)
array_map() (http://de2.php.net/manual/de/function.array-map.php)
array_reduce() (http://de2.php.net/manual/de/function.array-reduce.php)
array_walk() (http://de2.php.net/manual/de/function.array-walk.php)


*nureinfachmalsoindierundewerf*

Pingu


sind zwar nette sachen, aber in meinem Fall nicht brauchbar.
Würden das ganze Design nur unnötig kompliziert aussehen lassen/machen.
Naja im Momment läufts halt noch so, dass es kopiert wird, aber ich glaube ich könnte mir da echt ne menge ressourecn sparen.