random

Статус
В этой теме нельзя размещать новые ответы.

Slayter

Гуру форума
Регистрация
8 Апр 2006
Сообщения
231
Реакции
55
PHP:
<?php
class random {

     private $symbols;
     public  $result;
     
     public function __construct() {
         $this->symbols = 'qazxswedcvfrtgbnhyujmkiolp1234567890QAZXSWEDCVFRTGBNHYUJMKIOLP';
         $this->result  = null;
     }
     
     public function make( $max = 6 )
     {
            $size      = strlen($this->symbols)-1;
            while ($max > 0) {
                $this->result .= $this->symbols[rand(0,$size)]; 
                $max--;
            }
            return $this->result;
     }

}
?>
Examples:
PHP:
<?php
$random = new random();
echo '6 random characters: ' . $random->make();
echo '50 random characters: ' . $random->make(50);
?>
 
  • Заблокирован
  • #2
что то мне подсказывает что должно быть так
PHP:
<?php
$random = new random();
echo '6 random characters: ' . $random->make(6);
echo '50 random characters: ' . $random->make(50);
?>
,а не так
Examples:
PHP:
<?php
$random = new random();
echo '6 random characters: ' . $random->make();
echo '50 random characters: ' . $random->make(50);
?>

хотя может я не прав... заранее извияюсь)
 
ты не прав. извинения приняты :)
 
Juri, было бы неплохо чуток подучить синтаксис функций php. Если очень не хочется шастать по просторам, то вот:

PHP:
<?php
 function foo($param = 'Null')
{ if($param == 'Null') {echo 'Без параметров';}
   else { echo 'Параметр уазан и равен '.$param;}
}

// Запуск функции
foo();
foo('some parameter');
?>
Вот запусти и посмотри =)
 
что я делаю не так?

PHP:
print implode("",array_rand(array_flip(array_merge(range("A","z"),range("0","9"))),5));

5 - соотв кол-во элементов, если хотите шанс на повторение чисел/цифр, через запятую надо повторить range("A","z")
 
medvoodoo:ay:
что я делаю не так?

PHP:
print implode("",array_rand(array_flip(array_merge(range("A","z"),range("0","9"))),5));
5 - соотв кол-во элементов, если хотите шанс на повторение чисел/цифр, через запятую надо повторить range("A","z")

формально в первом посте было меньше вариантов символов

print_r(range("A","z"));
[23] => X
[24] => Y
[25] => Z
[26] => [
[27] => \
[28] => ]
[29] => ^
[30] => _
[31] => `

[32] => a
[33] => b
[34] => c
[35] => d

хотя в общем, согласен, ТС еще учиться и учиться
 
Ещё один вариант для range :
PHP:
$range = preg_replace('/[_\[\]\^`\x5c]/','',implode('',range('A','z')));
 
admLoki: range("A","Z"), range("a","z") все равно у меня в варианте они вместе собираются, прег работает чуть медленнее хотя тоже интересно.

Символы 26-31 в коде не стал убирать т.к. я так понял это модуль для генерации паролей.
 
Вот мой класс генерации рандомной строки (подойдет как для генерации паролей, так и для генерации символов капчей)
PHP:
<?php
	class rndstring_generator
	{
		private $symbols_count;
		private $chars;				// array of symbols to generate
		private $eng;
		private $num;
		public  $rnd_str;			// random string
		
		public function __construct($symbols_count=6)
		{	$this->chars = array();
			$this->symbols_count = $symbols_count;
			$this->eng 	= range('a','z');
			$this->num	= range(0,9);
			$this->rnd_str = '';
		}
		
		
		# $chars_case 	[none|lower|upper]
		# $chars_group 	[eng|num]
		public function _add_chars($chars_group,$chars_case='none')
		{	$this->chars = $this->merge($this->chars, $this->$chars_group, $chars_case);
		}
		
		
		private function merge($arr1,$arr2,$case)
		{	
			if($case == 'lower' || $case == 'none' || $case == 'all')
			{	foreach ($arr2 as $key=>$value)
				{		$arr1[] = $value;
				}
			}
			
			if ($case == 'upper' || $case == 'all')  
			{	foreach ($arr2 as $key=>$value)
				{		$arr1[] = strtoupper($value);
				}
			}
			return $arr1;
		}
		
		public function generate()
		{	
			$i = 0;
			while ($i<$this->symbols_count)
			{	$this->rnd_str.= $this->rnd_char();
				$i++;
			}
		}
		private function rnd_char()
		{	$rnd_key = array_rand(&$this->chars);
			return $this->chars[$rnd_key];
		}
	}
?>

Использование
PHP:
<?php
	$password_len = 6;
	$rnd_str = new rndstring_generator($password_len);
	$rnd_str->_add_chars('eng','all');
	$rnd_str->_add_chars('num','none');
	$rnd_str->generate();
			
	echo $rnd_str->rnd_str;
?>

Можно расширить алфавит спецсимолами, русскими буквами (без использования range, ибо не понимает он русские символы).
Плюс перед первым вариантом заключается в выборе кейса и набора символов.
 
Э, простите я не понял, зачем делать мега класс когда весь рендеринг можно уложить в одну строчку, для наглядности разнес на две.
PHP:
/**
* Одномерный массив определяющий набор символов в 
* результирующей строке
*@var array(char)
*/
$arrayS = array_merge(array("Б","Е"),range("A","z"),range("0","9"));
$result = implode("",array_rand(array_flip($arrayS),5));
Быстродействие выше.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху