Die Elemente in einem Array zufällig anordnen (Thema: PHP Beispiele)

Wie die Werte eines Arrays per Zufall sortiert werden können

Zum zufälligen Anordnen der Elemente in einem Array dient die Funktion shuffle(&$array).
PHP-Code
<?php
	$arr = array('eins', 'zwei', 'drei', 'vier', 'fünf');
	shuffle($arr); // das Array zufällig sortieren
	echo(implode(', ', $arr));  // Werte, getrennt durch Kommata ausgeben
?>
Ausgabe
drei, fünf, eins, vier, zwei

Will man eine eigene Funktion zur zufälligen Anordnung implementieren, dann könnte diese wie folgt aussehen (wobei auf mt_rand() zur Generierung von Zufallszahlen zurückgegriffen wird):
PHP-Code
<?php
	function my_shuffle($arr) {
		// array_values anwenden, sodass die Schlüssel numerisch und aufsteigend sind
		$vals = array_values($arr);
		$count = count($vals);
		$out = array();
		
		// die Schleife wird n Mal ausgeführt, wobei n der Anzahl der Elemente im Array entspricht
		for ($x=0; $x<$count; $x++) {
			// eine zufällige Position unter den noch verbleibenden Elementen ermitteln
			$pos = mt_rand(0, $count-1-$x);
			// das Element an dieser zufälligen Position als nächstes zur Rückgabe hinzufügen
			$out[] = $arr[$pos];
			// aus dem übergebenen Array dieses Element entfernen, sodass es nicht nochmal hinzugefügt werden kann
			unset($arr[$pos]);
			// durch unset() kann eine Lücke in den Schlüsseln entstanden sein
			// array_values() bildet automatisch neue Schlüssel
			$arr = array_values($arr);
		}
		return $out;
	}

	$arr = array('eins', 'zwei', 'drei', 'vier', 'fünf');
	$arr = my_shuffle($arr);
	echo(implode(', ', $arr));
?>
Ausgabe
vier, eins, fünf, drei, zwei

Um ein mehrdimensionales Array zufällig zu sortieren kann eine Funktion implementiert werden, welche rekursiv aufgerufen wird:
PHP-Code
<?php
	function shuffle_recursive($arr) {
		shuffle($arr);
		foreach ($arr as $key=>$val) {
			if (is_array($val)) {
				shuffle_recursive($val);
			}
		}
	}

	$arr = array(
		array('eins', 'zwei', 'drei'),
		array('zehn', 'zwölf', 'dreizehn')
	);
	shuffle_recursive($arr);
	var_dump($arr);
?>
Ausgabe
array(2) {
  [0]=>
  array(3) {
    [0]=>
    string(8) "dreizehn"
    [1]=>
    string(4) "zehn"
    [2]=>
    string(5) "zwölf"
  }
  [1]=>
  array(3) {
    [0]=>
    string(4) "eins"
    [1]=>
    string(4) "drei"
    [2]=>
    string(4) "zwei"
  }
}

Kommentare (0)

Von neu nach alt