Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Script Mods
 phpBB Adsense Mode

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 TLD Liste
 Webkatalog‑Verzeichnis

Partner
 Sprüche Treff

Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains...
https://www.Hosterplus.de
Artfiles.de
Bietet Serviceorientierte...
https://www.Artfiles.de
 
 
 

Zufällige Werte aus einem Array auswählen

Sie befinden sich: Home > Php Tutorial > Zufällige Werte aus einem A...

Zufällige Werte aus einem Array auswählen


Eintrag am:  30.01.2023
Hits / Besucher:  2157
Sprache:  Deutsch
Kategorie:  Einsteiger Tutorials...
Tutorial Art:  eigenes
Eingetragen von   schubertmedia schubertmedia
 
Beschreibung

Wer aus einem Array zufällig ein oder mehrere Elemente auswählen möchte, findet in array_rand() die passende Funktion. Sie gibt einen oder mehrere zufällige Schlüssel zurück, nicht die Werte selbst. Das ist ein wichtiger Unterschied, der bei assoziativen Arrays besonders relevant wird. Typische Einsatzbereiche sind zufällige Produktempfehlungen, rotierende Zitate oder das Auswählen von Quiz-Fragen.

Syntax und Grundlagen

Die Funktion erwartet ein Array und optional die Anzahl der gewünschten zufälligen Schlüssel:

array_rand(array $array, int $num = 1): int|string|array

Der Parameter $num bestimmt, wie viele Schlüssel zurückgegeben werden sollen. Standardmäßig ist er 1. Wenn $num größer ist als die Anzahl der Array-Elemente, wirft PHP seit Version 8.0 einen ValueError (in PHP 7.x eine Warnung).

Rückgabetyp: $num = 1 vs. $num > 1

Der häufigste Stolperstein bei array_rand() ist der wechselnde Rückgabetyp. Je nach Wert von $num gibt die Funktion entweder einen einzelnen Schlüssel oder ein Array von Schlüsseln zurück:

<?php

$farben = ["rot", "blau", "grün", "gelb"];

/* $num = 1: Einzelner Schlüssel (int) */
$key = array_rand($farben, 1);
echo gettype($key); // integer
echo $farben[$key]; // z.B. "blau"

/* $num = 2: Array von Schlüsseln */
$keys = array_rand($farben, 2);
echo gettype($keys); // array
/* $keys ist z.B. [0, 3] */

/* Zugriff auf die Werte */
foreach ($keys as $k) {
echo $farben[$k] . " ";
}
?>

Wichtig: Bei $num = 1 kann man den Rückgabewert direkt als Schlüssel verwenden. Bei $num > 1 muss man das Ergebnis mit einer foreach-Schleife durchlaufen. Ein foreach auf einem einzelnen Integer führt zu einem Fehler.

Beispiel mit assoziativem Array

Da array_rand() den Schlüssel zurückgibt und nicht den Wert, muss man bei assoziativen Arrays den zusätzlichen Schritt machen, den Wert über den Schlüssel abzurufen:

<?php

$farben = [
"rot" => "#FF0000",
"blau" => "#0000FF",
"grün" => "#00FF00",
"gelb" => "#FFFF00"
];

$key = array_rand($farben);
echo "Farbe: " . $key;
/* z.B. "Farbe: blau" */

echo "Hex-Wert: " . $farben[$key];
/* z.B. "Hex-Wert: #0000FF" */
?>

array_rand() gibt hier z.B. den String "blau" zurück, nicht den Hex-Code "#0000FF". Den Wert holt man mit $farben[$key]. Das ist der zentrale Unterschied zu Funktionen wie shuffle(), die direkt auf die Werte zugreifen.

Mehrere zufällige Elemente auswählen

Mit dem zweiten Parameter kann man festlegen, wie viele Schlüssel zurückgegeben werden. Die Anzahl darf die Größe des Arrays nicht überschreiten. Die Funktion count() hilft, die maximale Anzahl zu ermitteln:

<?php

$staedte = ["Berlin", "Hamburg", "München", "Köln", "Frankfurt"];

/* 3 zufällige Städte auswählen */
$keys = array_rand($staedte, 3);

foreach ($keys as $k) {
echo $staedte[$k] . " ";
}
/* z.B. "Berlin Köln Frankfurt" */
?>

Die zurückgegebenen Schlüssel sind immer sortiert, nicht in zufälliger Reihenfolge. Wer eine zufällige Reihenfolge braucht, kann das Ergebnis-Array mit shuffle() nachträglich mischen.

Sicherheitshinweis: Nicht kryptographisch sicher

array_rand() verwendet den internen PHP-Zufallsgenerator, der für allgemeine Zwecke ausreicht, aber nicht kryptographisch sicher ist. Für sicherheitsrelevante Szenarien wie Token-Generierung, Passwort-Erstellung oder Gewinnspiel-Auslosungen sollte stattdessen random_int() verwendet werden:

<?php

$zeichen = str_split('abcdefghijklmnopqrstuvwxyz0123456789');

/* UNSICHER für Tokens */
$key = array_rand($zeichen);
echo $zeichen[$key];

/* SICHER für Tokens */
$index = random_int(0, count($zeichen) - 1);
echo $zeichen[$index];
?>

Für rein dekorative Zwecke (z.B. ein zufälliges Zitat auf der Startseite) ist array_rand() völlig ausreichend. Nur wenn die Zufälligkeit sicherheitsrelevant ist, greift man zu random_int().

Vergleich: array_rand() vs. shuffle()

PHP bietet zwei Möglichkeiten, zufällige Elemente aus einem Array zu erhalten. Die Wahl hängt vom Einsatzzweck ab:

Eigenschaftarray_rand()shuffle()
Gibt zurückSchlüsselNichts (modifiziert Array)
Original-ArrayBleibt unverändertWird verändert
SchlüsselBleiben erhaltenWerden neu vergeben (0, 1, 2, ...)
EinsatzWenige zufällige ElementeGesamte Reihenfolge randomisieren
<?php

$karten = ["Herz", "Karo", "Pik", "Kreuz"];

/* array_rand: Original bleibt */
$key = array_rand($karten);
echo $karten[$key]; // z.B. "Pik"

/* shuffle: Original wird gemischt */
shuffle($karten);
print_r($karten);
/* Neue Reihenfolge, z.B. Kreuz, Herz, Pik, Karo */
?>

Wer nur ein oder zwei Elemente braucht und das Original-Array intakt lassen will, nimmt array_rand(). Wer das gesamte Array in zufälliger Reihenfolge braucht, nimmt shuffle().

Praxisbeispiel: Zufälliges Zitat anzeigen

Ein klassischer Einsatz für array_rand() ist die Anzeige eines zufälligen Zitats oder Tipps auf einer Webseite:

<?php

$zitate = [
"Einfachheit ist die höchste Stufe der Vollendung.",
"Der beste Zeitpunkt zum Programmieren war gestern.",
"Code ist wie Humor: Muss man ihn erklären, ist er schlecht.",
"Erst denken, dann coden.",
"Weniger Code, weniger Bugs."
];

$key = array_rand($zitate);
echo '<blockquote>' . $zitate[$key] . '</blockquote>';
?>

Bei jedem Seitenaufruf wird ein anderes Zitat angezeigt. Wer mehrere Zitate gleichzeitig anzeigen möchte, erhöht einfach den $num-Parameter und durchläuft die Schlüssel in einer Schleife. Der mit echo ausgegebene HTML-Code erzeugt ein gestyltes Zitat-Element.

Zufällige Elemente mit rand() auswählen

Alternativ zu array_rand() kann man auch rand() oder random_int() verwenden, um einen zufälligen Index zu erzeugen. Dieser Ansatz gibt mehr Kontrolle über den Zufallsgenerator:

<?php

$tipps = ["Tipp A", "Tipp B", "Tipp C", "Tipp D"];

/* Mit rand() */
$index = rand(0, count($tipps) - 1);
echo $tipps[$index];

/* Mit random_int() - kryptographisch sicher */
$index = random_int(0, count($tipps) - 1);
echo $tipps[$index];
?>

Der Unterschied: array_rand() arbeitet direkt mit dem Array und gibt den Schlüssel zurück, während rand() und random_int() nur einen numerischen Index erzeugen. Bei assoziativen Arrays ist array_rand() daher die bequemere Wahl.

Verwandte Tutorials

Die Arbeit mit zufälligen Werten und Arrays berührt verschiedene PHP-Themen:

Häufige Fragen zu array_rand()

Die folgenden Fragen klären typische Unsicherheiten beim Einsatz von array_rand().

Was passiert bei einem leeren Array?

Seit PHP 8.0 wirft array_rand() bei einem leeren Array einen ValueError. In älteren PHP-Versionen wurde eine Warnung ausgegeben und null zurückgegeben. Vor dem Aufruf sollte man daher prüfen, ob das Array Elemente enthält: if (count($array) > 0).

Gibt array_rand() immer andere Ergebnisse?

Im Prinzip ja, aber bei sehr kleinen Arrays (z.B. 2 Elemente) kommt es natürlich häufig zu Wiederholungen. Die Funktion garantiert keine Einzigartigkeit über mehrere Aufrufe hinweg. Wer sicherstellen möchte, dass sich Ergebnisse nicht wiederholen, muss die bereits gewählten Elemente selbst nachverfolgen.

Kann man die Schlüssel in zufälliger Reihenfolge erhalten?

Nein, bei $num > 1 gibt array_rand() die Schlüssel immer in ihrer ursprünglichen Reihenfolge zurück, nicht in zufälliger Reihenfolge. Um die Reihenfolge zu randomisieren, kann man das Ergebnis-Array mit shuffle() nachbehandeln.

Funktioniert array_rand() mit assoziativen Arrays?

Ja, uneingeschränkt. Bei assoziativen Arrays gibt die Funktion die String-Schlüssel zurück statt numerischer Indizes. Man erhält z.B. "rot" statt 0. Den zugehörigen Wert holt man dann mit $array[$key].

Wie vermeidet man den ValueError bei zu großem $num?

Der sicherste Ansatz ist, $num mit min() auf die Array-Größe zu begrenzen:

<?php

$items = ["A", "B", "C"];
$gewuenscht = 5;

/* Sicher: Begrenzt auf Array-Größe */
$num = min($gewuenscht, count($items));
$keys = array_rand($items, $num);

/* Achtung: Rückgabetyp prüfen! */
if (!is_array($keys)) {
$keys = [$keys];
}

foreach ($keys as $k) {
echo $items[$k] . " ";
}
?>

Der is_array()-Check stellt sicher, dass der Code auch dann funktioniert, wenn nur ein einzelner Schlüssel zurückgegeben wird. So vermeidet man sowohl den ValueError als auch das Problem mit dem wechselnden Rückgabetyp.

 

Tags:

 

Kommentare (0)

Noch keine Kommentare. Sei der Erste!

Melde dich an, um einen Kommentar zu schreiben.
Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.