Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

Depperte PHP-Frage (Arrays..)

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Neues Thema Antworten
depp ich
PostRank 9
PostRank 9
Beiträge: 1508
Registriert: 06.12.2004, 12:59

Beitrag von depp ich » 09.04.2011, 17:43

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?

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Synonym
PostRank 10
PostRank 10
Beiträge: 3708
Registriert: 09.08.2008, 02:55

Beitrag von Synonym » 09.04.2011, 18:18

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

depp ich
PostRank 9
PostRank 9
Beiträge: 1508
Registriert: 06.12.2004, 12:59

Beitrag von depp ich » 09.04.2011, 18:24

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..

Synonym
PostRank 10
PostRank 10
Beiträge: 3708
Registriert: 09.08.2008, 02:55

Beitrag von Synonym » 09.04.2011, 19:03

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

depp ich
PostRank 9
PostRank 9
Beiträge: 1508
Registriert: 06.12.2004, 12:59

Beitrag von depp ich » 09.04.2011, 19:28

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...

Synonym
PostRank 10
PostRank 10
Beiträge: 3708
Registriert: 09.08.2008, 02:55

Beitrag von Synonym » 09.04.2011, 20:28

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.

800XE
PostRank 10
PostRank 10
Beiträge: 5223
Registriert: 02.12.2004, 03:03

Beitrag von 800XE » 09.04.2011, 21:39

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 &#40; $i++ < $mischungen &#41;
  &#123;
    $c1=rand&#40; $karten &#41;;
    $c2=rand&#40; $karten &#41;;
    $stapel&#91; 0 &#93; = $stapel&#91; $c1 &#93;;
    $stapel&#91; $c1 &#93; = $stapel&#91; $c2 &#93;;
    $stapel&#91; $c2 &#93; = $stapel&#91; 0 &#93;;
  &#125;
&#125;

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag