Array Problem

flowerpower

Mitglied
Hallo, schon etwas lange her mit dem Programmieren, da stoße ich schon an meine Grenzen. :rolleyes:

PHP:
<?php

$array = array (1,2,3,4,5,6,7,8,9,10);
$pos = 0;


$pos = rand(0,count($array));
echo "Wert: ". $array[$pos]. " - Groesse: " . count($array). '</br>';
unset ($array [$pos]);
sleep (2);

$pos = rand(0,count($array));
echo "Wert: ". $array[$pos]. " - Groesse: " . count($array). '</br>';
unset ($array [$pos]);
sleep (2);

$pos = rand(0,count($array));
echo "Wert: ". $array[$pos]. " - Groesse: " . count($array). '</br>';
unset ($array [$pos]);
sleep (2);

$pos = rand(0,count($array));
echo "Wert: ". $array[$pos]. " - Groesse: " . count($array). '</br>';
unset ($array [$pos]);
sleep (2);

$pos = rand(0,count($array));
echo "Wert: ". $array[$pos]. " - Groesse: " . count($array). '</br>';
unset ($array [$pos]);
sleep (2);

$pos = rand(0,count($array));
echo "Wert: ". $array[$pos]. " - Groesse: " . count($array). '</br>';
unset ($array [$pos]);
sleep (2);


/*

weitere Stufen

*/

?>

Ich möchte hier zufällig Werte eines Arrays auslesen, den Wert entnehmen, bis x-1 Werte enthalten sind, solange bis das Array leer ist. Dabei dachte ich mir, man könnte den Wert nehmen und sogleich im Array löschen. Aber ich bekomme da mit jedem Durchlauf unterschiedliche Ergebnisse und zwar in der Hinsicht, dass das Array nicht verkleinert wird.

Habe zum Test nach jeder Stufe 2 Sekunden Schlaf gesetzt, aber auch das hilft nichts.

Ausgabe ist bspw.

Wert: 8 - Groesse: 10
Wert: 4 - Groesse: 9
Wert: 5 - Groesse: 8
Wert: - Groesse: 7
Wert: 2 - Groesse: 7
Wert: 1 - Groesse: 6


Hoffe, dass jemand das ganz leicht lösen kann.

Danke und Gruß. flowerpower
 
Zuletzt bearbeitet:
Das Problem ist ganz einfach das nach unset die Keys immernoch die gleichen sind wie vorher.
Beispiel:
PHP:
$arr = array(0,1,2);
unset($arr[1]);
$arr ist jetzt : array(0=>0;2=>2);
und nicht wie du in deinem code annimmst : array(0=>0;1=>2);
rand(0,count($array)) könnte dir jetzt z.B. 1 zurück geben. $arr[1] gibt es aber nicht mehr.

Wenn du eine zufällige Ausgabe des Arrays haben willst solltest du ganz einfach shuffle verwenden.
 
Ok, vielen Dank. Dann bleiben die jeweiligen Positionen bei unset im Array unbesetzt, aber die Position der anderen Werte ändert sich nicht entsprechend. Ist das korrekt?

Ich wollte die Überprüfung vermeiden, ob ich Wert x bereits entnommen habe, meinte sowas einmal bei Java gehabt zu haben, wenn man aus einem Stapel etwas einfügen oder entfernen kann.

Shuffle bietet wohl eine zufällige Entnahme, aber die Überprüfung auf doppelte Werte muss ich dann wohl vornehmen.

Gibt es da vielleicht noch eine andere Möglichkeit?
 
Ich wollte die Überprüfung vermeiden, ob ich Wert x bereits entnommen habe, meinte sowas einmal bei Java gehabt zu haben, wenn man aus einem Stapel etwas einfügen oder entfernen kann.
Die Überprüfung brauchst du auch nicht umbedingt. Sie wäre auch nicht sonderlich hilfreich da du keine Schleife verwendest. Du müsstest nur dafür sorgen das die Keys neu erstellt werden.

Shuffle bietet wohl eine zufällige Entnahme, aber die Überprüfung auf doppelte Werte muss ich dann wohl vornehmen.
Shuffle bietet keine zufällige Entnahme sondern ordnet alle Elemente in einem Array zufällig an. Das bedeutet du kannst di jegliches arbeiten mit rand() und unset() sparen und das Array einfach ausgeben.

Hier mal 3 Beispiele für dich:
1. Ausgabe in einer Schleife mit Überprüfung ob das Element existiert.
Das ist die unschönste Variante, weil das Script ewig laufen kann wenn rand() immer wieder einen nicht existierenden Key liefert.
PHP:
$array = array (1,2,3);

while(count($array) > 0){
	$pos = rand(0,count($array)-1);
	if(array_key_exists($pos,$array)){
		echo "Wert: ". $array[$pos]. " - Groesse: " . count($array). '</br>';
		unset($array[$pos]);
	}
}

2. Ohne überprüfung aber dafür werden die Keys des Arrays nach jedem unset neu erstellt
Die Variante ist eigentlich ganz ok. Aber immernoch unnötig viel Schreibarbeit verglichen mit Nummer 3
PHP:
$array = array (1,2,3);

while(count($array)>0){
	$pos = rand(0,count($array)-1);
	echo "Wert: ". $array[$pos]. " - Groesse: " . count($array). '</br>';
	unset($array[$pos]);
	$array=array_values($array);
}

3. Verwendung von shuffle
PHP:
$array = array (1,2,3);

shuffle($array);
foreach($array as $value){
	echo "Wert: ". $value. " - Groesse: " . count($array). '</br>';
}
 
Der Sourcecode ist erst einmal der Einstieg, zwischen den Ausgaben der einzelnen Werte passiert auch noch etwas mit denen. Aber da bin ich noch nicht.

Deine Ansätze sind gut, ich schaue mir das mal genauer an.

Vielen Dank.
 
Zurück