array_rand durch array_unique ergänzen?
Nicole
- php
Hallo erst mal ;-)
Ich nutze manchmal die funktion array_rand().
Bisher habe ich immer um sicherzugehen
das ergebniss in einem neuen Array gespeichert,
und zwar als array_unique.
Dieses um sicher zu gehen dass keine doppelten vorhanden sind.
Bei grossen Array ist das aber sehr serverlastig.
Bei einem Test mit 10.000 Einträgen fiel mir
auf dass auch array_rand schon keine doppelten
Einträge ausgibt.
Frage:
Hatte ich Glück(zb. gerade diese Php version..),
oder ist darauf Verlass, dass array_rand() niemals
ein Element doppelt auflistet ?
Anmerkung:
Der Gedanke deshalb, weil ja nur eine Zufallsausgabe erfolgt
und bei normalen Zufallsfunktionen können Werte sich ja auch
durchaus wiederholen.
Gruss Nikki
Moin Moin !
Gegenfragen:
Was ist an http://www.php.net/manual/de/function.array-rand.php und den Kommentaren dort so schwer zu verstehen ?
Was wäre so schlimm daran, auf "Nummer Sicher" zu gehen und das array_rand()-Ergebnis durch array_unique() zu jagen?
Alexander
Hallo Alexander,
Gegenfragen:
Was ist an http://www.php.net/manual/de/function.array-rand.php und den Kommentaren dort so schwer zu verstehen ?
Schön, dass du denkst zum Programmieren sollte man
perfekt English können ;-)
Was mich betrifft, NEIN
Gruss Nikki
Hi Nicole,
Schön, dass du denkst zum Programmieren sollte man
perfekt English können ;-)
Ohne Englisch kannst du nicht richtig Programmieren lernen. Das ist eine notwendige Vorraussetzung, wenn du über das Anfängerstadium hinauswillst.
Technisches Englisch -und nur darum geht es hier- ist nicht so schwer. Perfekt können musst du das dazu nicht und zu Anfang wird eben http://dict.leo.org häufiger mal herhalten müssen.
Gruss,
Carsten
Hallo Carsten,
nach über 3000 Scripts,
grösstenteils multiuser Anwendungen,
glaube ich nicht Anfängerin zu sein ;-)
Aber leider hört der Lernprozess natürlich nie auf,
doch bisher kam ich ganz gut ohne perfektes English aus.
Ohne Englisch kannst du nicht richtig Programmieren lernen. Das ist eine notwendige Vorraussetzung, wenn du über das Anfängerstadium hinauswillst.
Was ich mir leut Alexander anschauen sollte, waren Kommentare.
Und diese sind sogar häufig in deutsch schwer nachzuvollziehen.
Das Forum hier ist voll von unverständlichen Kommentaren,
wenngleich die Mehrheit der Kommentare sehr hilfreich ist, oder ?
Gruss Nikki
Hallo!
Was ist an http://www.php.net/manual/de/function.array-rand.php und den Kommentaren dort so schwer zu verstehen ?
Ich finde da auch keinen Kommentart zu diesem Thema. Mir war das auch mal aufgefallen, aber bin ebenfalls nicht sicher und habe weder bei google noch im Manual was dazu gefunden. Aber da ich noch _nie_ gesehen habe dass sich darin doppelte Einträge befinden gehe ich davon aus dass es unique ist, aber belegen kann ich das nicht.
| Was wäre so schlimm daran, auf "Nummer Sicher" zu gehen und das array_rand()-Ergebnis durch array_unique() zu jagen?
Die Frage war ja eben ob dies nötig ist ;-)
Grüße
Andreas
Danke Andreas,
Ich finde da auch keinen Kommentar zu diesem Thema. Mir war das auch mal aufgefallen, aber bin ebenfalls nicht sicher und habe weder bei google noch im Manual was dazu gefunden.
du sprichst mir aus dem Herzen ;-)
| Was wäre so schlimm daran, auf "Nummer Sicher" zu gehen und das array_rand()-Ergebnis durch array_unique() zu jagen?
Die Frage war ja eben ob dies nötig ist ;-)
Genau, weil das den Server extra belastet,
aber viele können das nicht nachvollziehen, weil
sie noch nie mit zig tausenden Einträgen arbeiten mussten ;-)
Gruss Nikki
Hi Nicole,
Genau, weil das den Server extra belastet,
aber viele können das nicht nachvollziehen, weil
sie noch nie mit zig tausenden Einträgen arbeiten mussten ;-)
Wieviele zufällige Einträge brauchst du denn?
Wenn du nur eine Handvoll brauchst ist das array_unique() ja relativ billig, weil es nur auf ein paar Elemente arbeiten muss.
Wenn du fast alle Einträge brauchst wäre shuffle(); eventuell eine Alternative.
Das mit der Serverlast ist grade bei Scriptsprachen oft schwer einzuschätzen (also welche Lösung wieviel Rechenzeit braucht). Hier könnte das das Einlesen und Erzeugen der zigtausend Einträge schon soviel Zeit brauchen das ein array_unique() mehr oder weniger gar nicht auffällt.
Die Lösung mit array_unique hat ja auch einen Nachteil: Die Anzahl der Ergebniselemente ist nicht vorhersagbar.
Gruss,
Carsten
Hallo Carsten,
danke für deinen Beitrag, aber...
Ich möchte doch nur erfahren, ob array_rand()
unter umständen doppelte ausgibt.
Aber anscheinden gibt es hier niemanden der es genau weiss,
nur Vermutungen.
Shuffle() ??
Ja das wäre auch gut,
leider ist der Zufallsgenerator nicht gerade gut bei dieser
Funktion, und es funktioniert nur bei numerischen arrays.
Gruss Nikki
p.s.
Doch die Serverlast bei array_unique fällt
leider auf. Ist ja auch klar jeder Neueintrag wird mit Inhalt verglichen auf vorhanden ;-)
Hi Nicole,
Ich möchte doch nur erfahren, ob array_rand()
unter umständen doppelte ausgibt.
Da diese Frage nicht zu beanworten ist versuchte ich auf dein vermutetes Problem einzugehen: die Serverlast.
Aber anscheinden gibt es hier niemanden der es genau weiss,
nur Vermutungen.
Es ist offensichtlich nicht dokumentiert. Möchtest du dich in deinen Scripten auf eine undokumentierte Eigenschaft verlassen?
Praktisch erzeugt es wohl keine doppelten, denn die wären bei kleinen (Test) Arrays recht wahrscheinlich und würden sofort auffallen.
Shuffle() ??
Ja das wäre auch gut,
leider ist der Zufallsgenerator nicht gerade gut bei dieser
Funktion, und es funktioniert nur bei numerischen arrays.
Ersteres erscheint unplausibel - der Zufallsgenerator ist AFAIK immer der gleiche, sonst würde das srand() vorher keinen Sinn ergeben. Das es nur numerische Indices verkraftet würde ich mal als Bug bezeichnen, es steht nirgends und macht auch keinen Sinn :-(.
Dann also $k=array_keys($dein_Feld); $k=shuffle($k); $k=array_slice($k,0,$anzahl); in $k stehen dann die Schlüssel zu deinem Feld in zufälliger Reihenfolge (also das was $k=array_rand($dein_array,$anzahl); auch liefern würde). Aber ob das schneller ist?
Doch die Serverlast bei array_unique fällt
leider auf. Ist ja auch klar jeder Neueintrag wird mit Inhalt verglichen auf vorhanden ;-)
Wie gesagt, das hängt von der Menge der benötigten Elemente ab, aber die verrätst du uns ja nicht ;-)
Mit $k=array_flip($k); $k=array_flip($k); kannst du auch doppelte aussortieren, solange im Array nur Integer und Strings stehen - evtl. ist das fixer.
Gruss,
Carsten
Moin Moin !
Hallo!
Was ist an http://www.php.net/manual/de/function.array-rand.php und den Kommentaren dort so schwer zu verstehen ?
Ich finde da auch keinen Kommentart zu diesem Thema.
Kommentar 1:
zak at php dot net
01-Sep-2000 06:55
array_rand for PHP3.
[und eine Menge PHP-Code]
Kommentar 2:
ssmith at personalcarehmo dot com
14-Nov-2000 04:03
[und noch mehr PHP-Code]
Kommentar 1 liefert eine Funktion, die array_rand() für PHP3 nachbilden soll. Kommentar 2 sagt, daß diese Nachbildung problematisch ist, weil sie doppelte Einträge enthalten kann.
Daraus kann man mit etwas Nachdenken folgern, daß array_rand() eben keine doppelten Einträge liefert, denn sonst wäre die Nachbildung eben nicht problematisch.
Alexander
Warum kompliziert wenns auch einfach geht.
Danke aber ein eifaches "Ja, array_rand enthält keine
doppelten Einträge" wäre ausrecheind und netter gewesen.
Zumindest veruche ich hier immer alles so zu beantworten.
Daraus kann man mit etwas Nachdenken folgern, daß array_rand() eben keine doppelten Einträge liefert, denn sonst wäre die Nachbildung eben nicht problematisch.
Was die Lösung betrifft:
...wenn ich zu allen Problemen hier im Forum,
aus den Kommemntaren etwas folgern würde, wäre vieles
mit Sicherheit falsch, da nicht jede Aussage stimmt.
Alles was ich wollte ist die Antwort, von jemanden
der es weiss und nicht folgert
(dann könnte ich auch aus meinen Tests folgern ),
ob wirklich keine DOPPELTEN VORKOMMEN KÖNNEN.
Danke Nikki
Hi!
Kommentar 1 liefert eine Funktion, die array_rand() für PHP3 nachbilden soll. Kommentar 2 sagt, daß diese Nachbildung problematisch ist, weil sie doppelte Einträge enthalten kann.
Daraus kann man mit etwas Nachdenken folgern, daß array_rand() eben keine doppelten Einträge liefert, denn sonst wäre die Nachbildung eben nicht problematisch.
Naja, alles mit php3 überlese ich normalerweise, da es meist nur workarounds sind. Danke für die Aufklärung.
Grüße
Andreas