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?
Was genau meinst du mit "web safe"? Das alte Konzept der "Web Safe Colours" ist nicht mehr aktuell.
Pekka
Jede Farbe hat einen Hex-Code… aber nur bestimmte werden garantiert auf allen Computern gleich gerendert. Ein bisschen lesen: bit.ly/hnFAbB
joshdcomp
3
Wie @Pekka sagt, ist das ein sehr veraltetes Konzept von damals, als einige Computer nur wenige hundert oder tausend Farben hatten. Jeder Computer, der heutzutage wahrscheinlich das Internet anzeigt, kann mit Millionen von Farben umgehen. Einige lesen: en.wikipedia.org/wiki/Web_colors#Web-safe_colors
ceejayoz
Selbst der Artikel von W3schools, auf den Sie verlinken, hat Recht: "Dies ist heute nicht wichtig, da die meisten Computer Millionen verschiedener Farben anzeigen können."
Pekka
1
UPDATE: Ich habe "web safe" aus der Frage entfernt, da das OP diese Qualifikation durch die akzeptierte Antwort ignoriert hat.
Danorton
Antworten:
100
Holen Sie sich eine Zufallszahl von 0 bis 255 und konvertieren Sie sie in hex:
Tatsächlich ist diese Methode die langsamste aller Antworten. Die letzten beiden Antworten sind 300% schneller (ich habe sie getestet, indem 2500 Tabellenzellen generiert und ausgegeben wurden).
Aleation
1
Die folgenden Antworten sind effizienter.
RevNoah
3
@aleation - 300% schneller als 0,005 Sekunden! großartig! Im Ernst, verwenden Sie das, was am besten lesbar ist. Wählen Sie nicht länger als 0,00007 Sekunden. (nicht sagen, meine ist am besten lesbar)
Galen
1
@aleation: Galen hat Recht, warum ich seine Antwort immer noch als akzeptierte Lösung markiert habe. Während die Dinge unten effizienter sind, kann ich den obigen Code unverändert lassen und die Leute werden verstehen, was ich tue. Nicht so sehr für die Oneliner unten.
Joshdcomp
Ob dies besser lesbar ist oder nicht, hängt von der Person ab, die es liest. Ich finde es viel lesbarer, wenn ich mich nicht um zwei Funktionen kümmern muss, und eine Einzeilige ist in ihrer Anwendung viel flexibler. Damit kann ich zB <? = '#'. str_pad (dechex (mt_rand (0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT); ?>
Rid Iculous
150
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:
Ohne Argument 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).
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!
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.
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.
Das range+ array_merge+ implodeist ü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.
Outis
Ich bin damit einverstanden, dass die Bereiche, Zusammenführen und Implodieren übertrieben waren und sie durch eine einfache Zeichenfolge ersetzt wurden. Ich habe an Hexadezimalzahlen wie '4488CC' gedacht, aber ich wollte es einfach in einer Codezeile halten, ohne dass die Zeile sehr lang wird. Ich habe eine Funktion erstellt, die Hexadezimalzahlen wie '4488CC' erzeugen kann. Ich werde sie meiner Antwort hinzufügen.
Dies funktioniert nicht für mehr als eine Farbe, da die Zeit gleich ist, ebenso wie die uniqid (). 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.
@ TimWolla: Ich bin nicht sicher, was Sie mit "Overkill" meinen, aber Anmerkung: 1) Es gibt nichts in der Frage, was den Zweck angibt oder wie "zufällig" die Zahl sein soll, und 2) In meinen Tests die Die von mir vorgeschlagene Antwort läuft erheblich schneller als die akzeptierte Antwort. 3) Anstatt wie bei der akzeptierten Antwort zwei Funktionen zu erstellen, ist meine Antwort eine einzelne Codezeile.
Danorton
<?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 !
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();
quelle
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)); }
quelle
Sie können md5 für diesen Zweck verwenden, sehr kurz
$color = substr(md5(rand()), 0, 6);
quelle
rand()
wird auf einigen Plattformen (einschließlich Windows gemäß Dokumentation ) keine Zahl zurückgegeben, die größer als 32767 ist . Abgesehen davonmd5()
bietet die Verwendung keine Vor- und Nachteile gegenüber der einfachen Konvertierung der Zahl in hexadezimal, dh dies führtmd5()
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 setzenstrtoupper()
die umstr_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 :)
quelle
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.
quelle
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 werdenstr_shuffle
, z. B. '4488CC', da jeder Austritt genau einmal in der Eingabezeichenfolge auftritt. Sie müssten jeden Hexit genau 6 Mal in der Eingabe wiederholenstr_shuffle
, um das richtige Verhalten zu erhalten, aber zu diesem Zeitpunkt wäre es immer noch übertrieben.$color = sprintf("#%06x",rand(0,16777215));
quelle
Kürzester Weg:
echo substr(uniqid(),-6); // result: 5ebf06
quelle
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.So mache ich es.
<?php echo 'rgba('.rand(0,255).', '.rand(0,255).', '.rand(0,255).', 0.73)'; ?>
quelle
Ab PHP 5.3 können Sie openssl_random_pseudo_bytes () verwenden :
$hex_string = bin2hex(openssl_random_pseudo_bytes(3));
quelle
<?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 !Wenn jemand helle Farben erzeugen möchte
sprintf('#%06X', mt_rand(0xFF9999, 0xFFFF00));
quelle
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.
quelle
Ich denke, das wäre auch gut, es bekommt jede Farbe zur Verfügung
$color= substr(str_shuffle('AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899'), 0, 6);
quelle
function random_color(){ return sprintf('#%06X', mt_rand(0, 0xFFFFFF)); }
quelle