86 votes

Générer un code couleur hexagonal aléatoire avec PHP

Je travaille sur un projet où je dois générer un nombre indéfini de codes de couleur hexadécimaux aléatoires Comment puis-je construire une telle fonction en PHP ?

3 votes

Qu'entendez-vous exactement par "web safe" ? L'ancien concept de "Couleurs sûres pour le Web" n'est plus d'actualité.

0 votes

Chaque couleur a un code hexadécimal mais seules certaines sont garanties d'être rendues de la même manière sur tous les ordinateurs. Un peu de lecture : bit.ly/hnFAbB

3 votes

Comme le dit @Pekka, c'est un concept très dépassé qui date de l'époque où certains ordinateurs ne disposaient que de quelques centaines ou milliers de couleurs. Tout ordinateur susceptible de consulter le web de nos jours peut gérer des millions de couleurs. Un peu de lecture : fr.wikipedia.org/wiki/Web_colors#Web-safe_colors

167voto

outis Points 39377

Une chaîne hexadécimale RVB est simplement un nombre compris entre 0x0 et 0xFFFFFF, il suffit donc de générer un nombre dans cette plage et de le convertir en hexadécimal :

function rand_color() {
    return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);
}

ou :

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

108voto

Galen Points 20535

Obtenez un nombre aléatoire de 0 à 255, puis convertissez-le en hexadécimal :

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

9 votes

En fait, cette méthode est la plus lente de toutes les réponses, les deux dernières réponses sont 300% plus rapides (j'ai testé la génération et la sortie de 2500 cellules de tableau) ;

1 votes

Les réponses ci-dessous sont plus efficaces.

4 votes

@aleation - 300% plus rapide que les .005 secondes ! génial ! Sérieusement, utilisez ce qui est le plus lisible. Ne chipotez pas sur 0,00007 seconde. (je ne dis pas que le mien est le plus lisible)

56voto

Susheel Points 674

Vous pouvez utiliser md5 à cette fin, très court

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

10 votes

Sans argument, rand() ne retournera pas un nombre supérieur à 32767 sur certaines plates-formes (y compris Windows, conformément à la directive documentation ). Cela dit, l'utilisation de md5() ne présente aucun avantage et quelques inconvénients par rapport à la simple conversion du nombre en hexadécimal, à savoir que md5() peut ne pas produire une distribution régulière (certaines chaînes hexagonales peuvent apparaître plus souvent que d'autres).

42voto

Cas Bloem Points 169
$rand = str_pad(dechex(rand(0x000000, 0xFFFFFF)), 6, 0, STR_PAD_LEFT);
echo('#' . $rand);

Vous pouvez modifier rand() pour mt_rand() si vous voulez, et vous pouvez mettre strtoupper() autour de la str_pad() pour que le nombre aléatoire soit plus joli (bien que ce ne soit pas obligatoire).

Elle fonctionne parfaitement et est beaucoup plus simple que toutes les autres méthodes décrites ici :)

18voto

Jake Points 741

Les couleurs hexagonales valides peuvent contenir de 0 à 9 et de A à F. Donc, si nous créons une chaîne avec ces caractères et que nous la mélangeons, nous pouvons prendre les 6 premiers caractères pour créer un code couleur hexagonal aléatoire. Un exemple est présenté ci-dessous !

code

echo '#' . substr(str_shuffle('ABCDEF0123456789'), 0, 6);

Je l'ai testé dans une boucle while et j'ai généré 10 000 couleurs uniques.

Le code que j'ai utilisé pour générer 10 000 couleurs uniques :

$colors = array();
while (true) {
   $color          = substr(str_shuffle('ABCDEF0123456789'), 0, 6);
   $colors[$color] = '#' . $color;
   if ( count($colors) == 10000 ) {
      echo implode(PHP_EOL, $colors);
      break;
   }
}

Ce qui m'a donné ces couleurs aléatoires comme résultat.


outis m'a fait remarquer que mon premier exemple ne pouvait pas générer des hexadécimaux tels que '4488CC'. J'ai donc créé une fonction qui serait capable de générer des hexadécimaux de ce type.

code

function randomHex() {
   $chars = 'ABCDEF0123456789';
   $color = '#';
   for ( $i = 0; $i < 6; $i++ ) {
      $color .= $chars[rand(0, strlen($chars) - 1)];
   }
   return $color;
}

echo randomHex();

Il serait préférable d'utiliser le deuxième exemple car il peut renvoyer beaucoup plus de résultats différents que le premier, mais si vous ne comptez pas générer beaucoup de codes de couleur, le premier exemple conviendra parfaitement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X