random

Статус
В этой теме нельзя размещать новые ответы.
Затем, что класс лучше в плане расширяемости...

И управляемость классом выше. Ибо для того, чтобы убрать группу символов, которые не нужны - в вашем случае нужно менять код. А в моем - просто не вызывать метод ;)
 
к предыдущим постам: перед array_rand необходим shuffle($ArrayP); т.к. срез массива берется подряд!!!!
Что меня не устраивает в вашем классе:
1) необходимость создания нескольких экземпляров с разными параметрами. без возможности их переопределить
2)Получающийся большой текст вызова, учтем, что действие достаточно специфическое :)
чтобы просто так не критиковать написал рабочий готовый класс. я думаю почти final:
PHP:
<?php
/**
 * CREATE RANDOM STRING
 *
 * @package nulled.ws 
 * @author Medvoodoo
 * @copyright Medvoodoo
 * @version 0.1 a
 * 
 */
class crs
{
	/**
	 * Статический метод предназначен для генерации ключей
	 * 
	 * $Type варианты ключей, мжет использоваться несколько подряд: 
	 * c - [a-z]
	 * C - [A-Z]
	 * d - [0-9]
	 * a - [A-z]
	 * A - [A-z][0-9]
	 *
	 * @param integer $Num кол-во символов
	 * @param string $Type какой набор символов использовать
	 * @param unknown_type $Repeat сколько раз может повторяться символ
	 * @param unknown_type $ArrayS дополнительные символы
	 * @return string результирующий ключ
	 */
	static function create($Num,$Type,$Repeat = 1,$ArrayS = array())
	{
		$ArrayP = array();//результирующий массив
		
		$Type = "_".$Type;//для скорости		
		while($Repeat)
		{
			
			if(strpos($Type,"c")) $ArrayP = array_merge($ArrayP, range("a","z"));//для маленьких букв
			if(strpos($Type,"C")) $ArrayP = array_merge($ArrayP, range("A","Z"));//для больших букв
			if(strpos($Type,"d")) $ArrayP = array_merge($ArrayP, range("0","9"));//для цифр
			if(strpos($Type,"a")) $ArrayP = array_merge($ArrayP, range("A","z"));//для всех символов диапазона A-z
			if(strpos($Type,"A")) $ArrayP = array_merge($ArrayP, range("A","z"), range("0","9"));//для всех символов включая цифры
			$ArrayP = array_merge($ArrayP,$ArrayS);//добавляю
                        $Repeat--;
		}
		shuffle($ArrayP);
		return implode("",array_rand(array_flip($ArrayP),$Num)); 
	}
}
//примеры
print "5 символов [a-z][A-Z] без повторений :".crs::create(5,"cC")."<br>";
print "6 символов [0-9] возможны 2 повторения :".crs::create(6,"d",2)."<br>";
print "10 символов [A-z][0-9](АБВ) возможны 4 повторения :".crs::create(10,"A",4,array("А","Б","В"))."<br>";
 
А вот тут уже скажу "ЗочеД"... Это ближе к телу :)

Только одно пожелание - for заменить на foreach - так красивше :)
 
roddik не перепутал, в пхп 5.2 обнаружил такой косяк, что срез массива не рендомом берет.
А вот тут уже скажу "ЗочеД"... Это ближе к телу :)

Только одно пожелание - for заменить на foreach - так красивше :)

Jeurey Исправил на while :) он быстрее и на одну переменную меньше
 
Йа тесты проводил :) foreach быстрее в пределах 1000 итераций :)
 
Исправил для ускорения.
Спасибо за дельные замечания Jeurey
Теперь FINAL
 
medvoodoo, чисто ради приличия, воткни в класс конструктор и деструктор :) .
 
чисто ради приличия класс содержит ТОЛЬКО статические элементы, но можно воткнуть что нибуть типа
PHP:
private __construct(){}
это не ошибка :)
 
Вот как-то недавно наковырял:

PHP:
function genPasswd ( $length )
{

	$charlist = array_diff(range(65, 122), range(90, 97));

	shuffle($charlist);

	$charlist = array_slice($charlist, 0, $length);

	$charlist = array_map('chr', $charlist);

	$charlist = join('', $charlist);

	return $charlist;

}

можно ещё расширить функционал для исключения/включения нужных символов :)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху