Seite 1 von 1
Depperte PHP-Frage (Arrays..)
Verfasst: 09.04.2011, 17:43
von depp ich
Ja, sorry - ich bin zu blöd....
Ich hole ein zufälliges Element aus einem Array, lösche es und hänge es hinten wieder an. (Ziel ist, dass zuletzt benutzte Elemente nicht gleich wieder verwendet werden)
$r = rand ( 0 , count($list) - 10);
$tx = $list[$r];
unset ($list[$r]);
$list[] = $tx;
Das geht nicht, weil ich mit zb $list[5] nicht das 5. Element anspreche, sondern das mit dem Key 5 - und das ja möglicherweise woanders.
Wie geht das wirklich?
Verfasst: 09.04.2011, 18:18
von Synonym
Hm, das kommt aber doch auch darauf an, was Du für einen Index (Key) hast. Ist der nummerisch, dann kannst Du doch einfach die Keys neu generieren lassen. Dann rücken alle anderen eine Stelle vor und das "zufällige" nach hinten.
Oder Du gehst nicht über die Keys sondern über die Elemente selbst, indem Du den Zeiger verschiebst. Dann aber mit current(), end(), prev(), reset() und each() und dergleichen
https://www.php.net/manual/de/function.next.php
Verfasst: 09.04.2011, 18:24
von depp ich
Naja - es kommt mit nicht elegant vor, jedesmal die Keys neu zu generieren. (Wie geht das überhaupt?)
Und mit current(), end(), prev(), reset() und each() usw habe ich ja keine Zufälle.
Da könnte ich gleich per foreach durch die Liste gehen und zufällig stoppen. Wenig effektiv..
Verfasst: 09.04.2011, 19:03
von Synonym
Nun, Keys neu generieren kann man mit array_merge().
https://de3.php.net/array_merge
Bei dem current()... Zeugs hast Du schon Zufälle, wenn Du eben vorher eine zufällige Positon ermittelst und denn eben bis dahin "durchwanderst".
Elegant ist das alles nicht, kann es eigentlich aber auch nicht werden.
Wäre es nicht besser, einfach alle bereits benutzten Werte aus dem Array zu entfernen und evtl. in ein neues zu schreiben. Wenn das erste Array dann komplett leer ist, dann eben wieder alles zurück kopieren und neu beginnen.
Und für den "Zufall" eben nicht das normale rand(), sondern das eigentliche array_rand() . Damit bekommt zu dann ja auch nicht einfach eine zufällige Zahl, sondern eben einen zufälligen Key, egal welchen Wert der hat.
https://de3.php.net/manual/en/function.array-rand.php
Verfasst: 09.04.2011, 19:28
von depp ich
Hmm... So kompliziert für eine so einfache Sache..?
Mit array_merge() funktioniert es. Das nehme ich mal, weil die Sache nicht zeitkritisch ist.
Ich danke dir für den Hinweis...
Verfasst: 09.04.2011, 20:28
von Synonym
Nein, einfach ist das so leider nicht mehr, da Du ja quasi einen zufälligen Wert aus einem Bereich von einem Array haben willst. Ein Zufallswert aus einem ganzen Array ist kein Problem, dafür gibt es ja array_rand(). Du ignorierst aber die letzten 10 Elemente, also musst Du mit dem normalen rand() zählen. Das liefert als Ergebnis aber nur eine Zahl aus dem Bereich von "1" bis "Summe Array-Elemente". Diese Zahl kannst Du aber dann nicht als "Key" verwenden, da der Key ja nicht vorhanden sein muss. Daher das extra "durchnummerieren". array_rand würde direkt den Key liefern, aber eben aus dem ganzen Array und nicht nur aus einem Bereich. Möglich wäre da nur noch eine Kombi mit array_slice() um einen Teilbereich zu bekommen, aber performater ist das sicherlich auch nicht. Es gängt also immer wieder an den letzten (unberücksichtigen) 10 Elementen.
Re: Depperte PHP-Frage (Arrays..)
Verfasst: 09.04.2011, 21:39
von 800XE
depp ich hat geschrieben:$r = rand ( 0 , count($list) - 10);
$tx = $list[$r];
unset ($list[$r]);
$list[] = $tx;
Das geht nicht, weil ich mit zb $list[5] nicht das 5. Element anspreche, sondern das mit dem Key 5 - und das ja möglicherweise woanders.
Wie geht das wirklich?
ich würde da einen "index" anlegen
via foreach diese Elementnahmen auslesen und in ein Array schreiben
Code: Alles auswählen
$i=0;
foreach .....
$index[ ++$i ] = Elementname
und dann meinen Würfelbecher
(damals 80ger aufm 800XL ausgedacht)
ähm, Kartenmischer
Wenn ich via "Rand" eine Karte aus dem Stapel ziehe, dann könnte ich eine Karte auch mehrfach bekommen
darum
$karte[1] ausgeben
$karte[2] ausgeben
.....
und die Karten vorher mischen
Code: Alles auswählen
function ( $stapel, $katen, $mischungen )
{
$i=0; while ( $i++ < $mischungen )
{
$c1=rand( $karten );
$c2=rand( $karten );
$stapel[ 0 ] = $stapel[ $c1 ];
$stapel[ $c1 ] = $stapel[ $c2 ];
$stapel[ $c2 ] = $stapel[ 0 ];
}
}