Generieren eines zufälligen Hex-Farbcodes mit PHP


77

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?


3
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:

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();

8
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:

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));
}

52

Sie können md5 für diesen Zweck verwenden, sehr kurz

$color = substr(md5(rand()), 0, 6);

10
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).
Outis

1
Super schön und sauber
Emir Memic

34
$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 :)


17

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.


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.
Jake


8

Kürzester Weg:

echo substr(uniqid(),-6); // result: 5ebf06

3
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.
Emotionalität

6

So mache ich es.

<?php echo 'rgba('.rand(0,255).', '.rand(0,255).', '.rand(0,255).', 0.73)'; ?>

4

Ab PHP 5.3 können Sie openssl_random_pseudo_bytes () verwenden :

$hex_string = bin2hex(openssl_random_pseudo_bytes(3));

2
openssl ist dafür viel zu viel.
TimWolla

1
@ 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 !
Berry M.

4

Wenn jemand helle Farben erzeugen möchte

sprintf('#%06X', mt_rand(0xFF9999, 0xFFFF00));

2

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.


1

Ich denke, das wäre auch gut, es bekommt jede Farbe zur Verfügung

$color= substr(str_shuffle('AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899'), 0, 6);

1
function random_color(){  
 return sprintf('#%06X', mt_rand(0, 0xFFFFFF));
}

2
Doppelte Antwort.
Outis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.