array_rand () массив в строку? - PullRequest
1 голос
/ 13 января 2012

У меня есть массив, такой как:

$hex = array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");

Я хочу вернуть 6 случайных элементов в виде строки (например, 1a3564):

$random_color = array_rand($hex,6);

Я думал, взорвав $ random_colorсделал бы хитрость:

echo implode($random_color);

Но array_rand () хранит позиции элементов в родительском массиве, а не элементы этого массива, поэтому я получаю что-то вроде:

259111213 вместо 259bcd.

Я знаю, что это именно то, что я хочу:

echo $hex[$random_color[0]];
echo $hex[$random_color[1]];
echo $hex[$random_color[2]];
echo $hex[$random_color[3]];
echo $hex[$random_color[4]];
echo $hex[$random_color[5]];

Но:

  • есть ли способ сохранить элементы массива в array_rand()?Почему в первую очередь хранятся позиции элементов вместо элементов?

  • Каков наилучший способ сделать то, что я хочу достичь?

  • почему array_rand () НИКОГДА не выбирает букву в качестве первого элемента и почти никогда не в качестве второго / третьего (99% сгенерированных цветов выглядят как 11111a 12345c 123456)?

Ответы [ 7 ]

5 голосов
/ 13 января 2012

Случайные цвета должны генерироваться более простым способом:

printf('%02x%02x%02x',mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));

или

printf('%06x',mt_rand(0,16777215));

Если вам нужно сохранить цвет в переменной, используйте sprintfвместо printf

5 голосов
/ 13 января 2012

Так как все элементы различны, вы можете превратить их в ключи, а не в значения, а затем использовать array_rand для результата:

implode('', array_rand(array_flip($hex), 6));

Однако, может быть, есть лучший способ достичь общего результата.Цель.Например, если общая цель допускает повторение цифр, просто сгенерируйте случайное число от 0 до 0xFFFFFF и преобразуйте в шестнадцатеричную строку :

dechex(mt_rand(0, 0xFFFFFF));
  1. Почему в первую очередь он сохраняет позиции элементов вместо элементов?

    На странице руководства:

    Это сделано для того, чтобы вы могли выбирать случайные ключиа также значения из массива.

  2. , почему array_rand () НИКОГДА не выбирает букву в качестве первого элемента и почти никогда не в качестве второго / третьего (99% сгенерированных цветов выглядят как 11111a 12345c 123456)?

    array_rand использует rand (php_rand, в источнике C),В зависимости от вашей системы php_rand составляет rand, random или lrand48.rand - особенно плохой генератор случайных чисел.

3 голосов
/ 13 января 2012

array_rand() возвращает ключи случайно выбранных элементов ( см. Руководство , раздел Возвращаемые значения ).

Чтобы он работал должным образом, используйте array_flip(), чтобы получить ключи:

$random_color = array_rand(array_flip($hex), 6);

Что касается "странных" результатов, когда почти нет букв первых элементов, IDEOne и мой сервер , похоже, воспроизводят эти выводы. Локальный компьютер, работающий в моем офисе (все еще работающий с Debian etch / PHP 5.2.9), кажется, не согласен и равномерно распределяет элементы из $hex ... Кажется, что это версия PHP?

2 голосов
/ 13 января 2012

Если вы просто хотите получить случайную строку из шестнадцатеричных цифр, вы также можете сделать что-то вроде

substr(md5(time()),-6);

или

substr(md5(uniqid()),-6);

Вы можете получить аналогичные результаты без необходимости связываться смассив.

2 голосов
/ 13 января 2012

вы близки, попробуйте это:

$hex = array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
shuffle($hex);

echo sub_str(implode('',$hex),0,6);
2 голосов
/ 13 января 2012

Если вам не нужно поддерживать порядок массива $hex, вы можете заменить его на shuffle () . Примерно так ( пример кодовой панели ):

<?php
$hex = array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
shuffle($hex);
echo implode(array_slice($hex, 0, 6));
1 голос
/ 13 января 2012

есть ли способ сохранить элементы массива в array_rand ()?Почему в первую очередь он хранит позиции элементов вместо элементов?

В соответствии с документацией array_rand он возвращает массив 'keys', а не 'values'.Поскольку ваш массив не является ассоциативным массивом, ключи являются числами.Вам нужно будет сделать (не проверено):

$result = "";
$random_color = array_rand($hex, 6);
foreach ($random_color as $randomIndex) {
  $result = $result . $hex[$randomIndex];
}

Не использовать массив в случайном порядке или array_rand , потому что элементы не могут повторяться при таком подходе.Это не то, что вы пытаетесь сделать.

Каков наилучший способ сделать то, что я хочу достичь?

Если вы хотите создать случайный цвет, вы можетеиспользуйте:

$color = '';
while(strlen($c) < 6) {
    $color .= sprintf("%02X", mt_rand(0, 255));
}

, почему array_rand () НИКОГДА не выбирает букву в качестве первого элемента, а почти никогда не в качестве второго / третьего (99% сгенерированных цветов выглядят как 11111a 12345c 123456)?

Возможно, вам потребуется инициализировать генератор случайных чисел , но это всего лишь предположение (см. Комментарий Тимура к этому ответу).

mt_srand((double)microtime()*1000000);
...