Ich arbeite an einem Projekt, in dem ich eine undefinierte Anzahl zufälliger hexadezimaler Farbcodes generieren muss. Wie würde ich vorgehen, um eine solche Funktion in PHP zu erstellen?
Ich arbeite an einem Projekt, in dem ich eine undefinierte Anzahl zufälliger hexadezimaler Farbcodes generieren muss. Wie würde ich vorgehen, um eine solche Funktion in PHP zu erstellen?
Antworten:
Holen Sie sich eine Zufallszahl von 0 bis 255 und konvertieren Sie sie in hex:
function random_color_part() {
return str_pad( dechex( mt_rand( 0, 255 ) ), 2, '0', STR_PAD_LEFT);
}
function random_color() {
return random_color_part() . random_color_part() . random_color_part();
}
echo random_color();
Eine RGB-Hex-Zeichenfolge ist nur eine Zahl von 0x0 bis 0xFFFFFF. Generieren Sie also einfach eine Zahl in diesem Bereich und konvertieren Sie sie in hexadezimal:
function rand_color() {
return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);
}
oder:
function rand_color() {
return sprintf('#%06X', mt_rand(0, 0xFFFFFF));
}
Sie können md5 für diesen Zweck verwenden, sehr kurz
$color = substr(md5(rand()), 0, 6);
rand()
wird auf einigen Plattformen (einschließlich Windows gemäß Dokumentation ) keine Zahl zurückgegeben, die größer als 32767 ist . Abgesehen davon md5()
bietet die Verwendung keine Vor- und Nachteile gegenüber der einfachen Konvertierung der Zahl in hexadezimal, dh dies führt md5()
möglicherweise nicht zu einer regelmäßigen Verteilung (einige hexadezimale Zeichenfolgen können häufiger auftreten als andere).
$rand = str_pad(dechex(rand(0x000000, 0xFFFFFF)), 6, 0, STR_PAD_LEFT);
echo('#' . $rand);
Sie können einstellen , rand()
in für , mt_rand()
wenn Sie wollen, und Sie können setzen strtoupper()
die um str_pad()
um die Zufallszahl Blick schöner zu machen (obwohl es nicht erforderlich ist).
Es funktioniert perfekt und ist viel einfacher als alle anderen hier beschriebenen Methoden :)
Gültige Hex-Farben können 0 bis 9 und A bis F enthalten. Wenn wir also eine Zeichenfolge mit diesen Zeichen erstellen und diese dann mischen, können wir die ersten 6 Zeichen greifen, um einen zufälligen Hex-Farbcode zu erstellen. Ein Beispiel ist unten!
Code
echo '#' . substr(str_shuffle('ABCDEF0123456789'), 0, 6);
Ich habe dies in einer while-Schleife getestet und 10.000 einzigartige Farben generiert.
Code, mit dem ich 10.000 einzigartige Farben generiert habe:
$colors = array();
while (true) {
$color = substr(str_shuffle('ABCDEF0123456789'), 0, 6);
$colors[$color] = '#' . $color;
if ( count($colors) == 10000 ) {
echo implode(PHP_EOL, $colors);
break;
}
}
Was mir diese zufälligen Farben als Ergebnis gab.
outis wies darauf hin, dass mein erstes Beispiel keine Hexadezimale wie '4488CC' erzeugen konnte, also habe ich eine Funktion erstellt, die Hexadezimale wie diese erzeugen kann.
Code
function randomHex() {
$chars = 'ABCDEF0123456789';
$color = '#';
for ( $i = 0; $i < 6; $i++ ) {
$color .= $chars[rand(0, strlen($chars) - 1)];
}
return $color;
}
echo randomHex();
Das zweite Beispiel ist besser zu verwenden, da es viel mehr unterschiedliche Ergebnisse als das erste Beispiel liefern kann. Wenn Sie jedoch nicht viele Farbcodes generieren, funktioniert das erste Beispiel einwandfrei.
range
+ array_merge
+ implode
ist übertrieben (warum nicht einfach eine String-Konstante verwenden?). Es gibt viele potenzielle zufällige Farbzeichenfolgen, die als Ergebnis von nicht erzeugt werden str_shuffle
, z. B. '4488CC', da jeder Austritt genau einmal in der Eingabezeichenfolge auftritt. Sie müssten jeden Hexit genau 6 Mal in der Eingabe wiederholen str_shuffle
, um das richtige Verhalten zu erhalten, aber zu diesem Zeitpunkt wäre es immer noch übertrieben.
Kürzester Weg:
echo substr(uniqid(),-6); // result: 5ebf06
The uniqid() function generates a unique ID based on the microtime (current time in microseconds).
Für diejenigen unter Ihnen, die mehr als eine Farbe gleichzeitig erzeugen möchten.
Ab PHP 5.3 können Sie openssl_random_pseudo_bytes () verwenden :
$hex_string = bin2hex(openssl_random_pseudo_bytes(3));
<?php foreach(range(0,100) as $n){echo("<div style='background-color:#".(bin2hex(openssl_random_pseudo_bytes(3))).";padding:1em;'></div>");}?>
zeigt, dass dies die farbenfrohsten und zufälligsten Ergebnisse liefert. Probieren Sie es mit phpfiddle.org !
Web-sichere Farben sind nicht mehr erforderlich (und auch kein gültiges Konzept), da selbst mobile Geräte heutzutage mehr als 16-Bit-Farben haben.
Siehe Wikipedia für weitere Informationen.
Mit anderen Worten, verwenden Sie eine beliebige Farbe von # 000000 bis #FFFFFF.
edit: Liebe Downvoters. Überprüfen Sie zuerst den Bearbeitungsverlauf für die Frage.
Ich denke, das wäre auch gut, es bekommt jede Farbe zur Verfügung
$color= substr(str_shuffle('AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899'), 0, 6);