首页 > 编程技术 > php

再整理一个php 产生不重复随机数5个方法

发布时间:2016-11-25 15:38

php中有很多自带的随机函数这些函数可以生成随机的但多次之后可能会重复,下面整理了一些 产生不重复随机数的函数。

无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地。在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下(ps:方法1、4、5是我常用的,其余来自网络整理)

方法一:

 代码如下 复制代码
<?php
$numbers = range (1,50);
//shuffle 将数组顺序随即打乱
shuffle ($numbers);
//array_slice 取该数组中的某一段
$num=6;
$result = array_slice($numbers,0,$num);
print_r($result);
?>

 

方法二:

 代码如下 复制代码
<?php
$numbers = range (1,20);
//播下随机数发生器种子,可有可无,测试后对结果没有影响
srand ((float)microtime()*1000000);
shuffle ($numbers);
//跳过list第一个值(保存的是索引)
while (list(, $number) = each ($numbers)) {
echo "$number ";
}
?>

 

方法三:

 代码如下 复制代码
<?php
function NoRand($begin=0,$end=20,$limit=5){
$rand_array=range($begin,$end);
shuffle($rand_array);//调用现成的数组随机排列函数
return array_slice($rand_array,0,$limit);//截取前$limit个
}
print_r(NoRand());
?>

 

上述可以在1-20间随机产生5个不重复的值

方法四:

 代码如下 复制代码
<?php
$tmp=array();
while(count($tmp)<5){
$tmp[]=mt_rand(1,20);
$tmp=array_unique($tmp);
}
print_r($tmp);
?>

 

方法五:

 代码如下 复制代码

<?php
$tmp = range(1,30);
print_r(array_rand($tmp,10));
?>
 

这个可能是比叫简单的了(ps:如果在range中指定了步长,就必须注意array_rand的第二个参数是否超出$tmp的长度)。

PHP提供非常丰富的数组函数,产生随机数大多可以从数组这个角度出发,若你还有方法提供,欢迎给出,文章将持续更新。

DIRECTORY_SEPARATOR在php是什么意思呢,在什么时候使用DIRECTORY_SEPARATOR最合理呢?下面来给各位介绍一下php DIRECTORY_SEPARATOR常量。

我们知道DIRECTORY_SEPARATOR是一个PHP常量,代表反斜杠,因为windows系统和linux系统的反斜杠不一样。在 Windows 中,斜线(/)和反斜线(\)都可以用作目录分隔符,在linux上路径的分隔符是”/”。

那么在PHP代码中什么时候要用DIRECTORY_SEPARATOR代表反斜杠呢?

比如这句话:

 代码如下 复制代码

require_once dirname(__FILE__).DIRECTORY_SEPARATOR . './../../../wp-config.php';
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'inc/options.php';

这两句PHP代码,为什么前面部分用DIRECTORY_SEPARATOR,而后面部分却用“/”呢
众所周知,windows下的是\和/,而LINUX下的是/

在程序本地运行很正常,上传到服务器后,发现图片没有显示出来,图片链接是绝对路径 var/,而且当中带有 \ 但是我记得这个路径已经处理成相对路径的

 代码如下 复制代码
            $path    = dirname(dirname(dirname(__FILE__))).'\\';
            $search = array( $path, '\\');
            $replace = array( '', '/');
            return str_replace($search,$replace,$this->tempfolder).$this->filename_prefix.$public.'.jpg';

可以各位也看出来了,第一行代码的用在LINUX “\\”, 就不行。

解决的办法是 用PHP 预定义常量DIRECTORY_SEPARATOR来代替'\','/'这样的路径分隔符,以前觉得既然windows,LINUX 都支持/,那都用成 / 得了,这是没错的。可是从这个例子可以看出,当要对路径字符串进行处理的时候,就比较危险了,所以最好还是用DIRECTORY_SEPARATOR吧

php引用是一个很有学问的东西了,下文我们来介绍php引用返回function & fun();学习笔记,希望例子可以帮助到各位。

例子

 代码如下 复制代码

<?php
    class talker{

        private $data = 'Hi';

        public function & get(){
            return $this->data;
        }
      
        public function out(){
            echo $this->data;
        }  

    }

    $aa = new talker();
    $d = &$aa->get();

    $aa->out();
    $d = 'How';
    $aa->out();
    $d = 'Are';
    $aa->out();
    $d = 'You';
    $aa->out();
//the output is "HiHowAreYou"
?>

例子二:

 代码如下 复制代码

<?php
class person{
private $name;
function & getName(){
return $this->name;
}
}

$p = new person();
//注person类中的getName无论前面加不加& 在此调用都不会报错;只不过这样调用没有任何意义
$name = & $p->getName();
$name = 'walker';
$name = $p->getName();
echo $name;//输出walker


补充:函数的引用返回

 代码如下 复制代码

<?php
function &test()
{
    static $b=0;//申明一个静态变量
    $b=$b+1;
    echo $b;
    return $b;
}

$a=test();//这条语句会输出 $b的值 为1
$a=5;
$a=test();//这条语句会输出 $b的值 为2

$a=&test();//这条语句会输出 $b的值 为3
$a=5;
$a=test();//这条语句会输出 $b的值 为6
?>

下面解释下: 

通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别 至于原因: 这是PHP的规定
PHP规定通过$a=&test(); 方式得到的才是函数的引用返回
至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。) 这句狗屁话 害我半天没看懂

用上面的例子来解释就是
$a=test()方式调用函数,只是将函数的值赋给$a而已, 而$a做任何改变 都不会影响到函数中的$b
而通过$a=&test()方式调用函数呢, 他的作用是 将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方
即产生了相当于这样的效果($a=&$b;) 所以改变$a的值 也同时改变了$b的值 所以在执行了
$a=&test();
$a=5;
以后,$b的值变为了5

这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中

另附一个php官方例子:

 代码如下 复制代码

This is the way how we use pointer to access variable inside the class.

<?php
class talker{

    private $data = 'Hi';

    public function & get(){
        return $this->data;
    }
  
    public function out(){
        echo $this->data;
    }  

}

$aa = new talker();
$d = &$aa->get();

$aa->out();
$d = 'How';
$aa->out();
$d = 'Are';
$aa->out();
$d = 'You';
$aa->out();
?>

the output is "HiHowAreYou"

在开发中验证邮箱、url、数字是我们常用的一些例子,下面整理了两个不同站长写的验证邮箱、url、数字程序,大家有兴趣可参考一下。

例子

 代码如下 复制代码

public static function isEmail( $email )

{

return preg_match("/^([a-z0-9]*[-_\.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,4}([\.][a-z]{2})?$/i" , $email  );
}

public static function isNumber( $num )
{
return is_numeric( $num );
}

public static function isUrl( $url , $preg = false )
{
if( $preg )
{
$status = preg_match ( "/^([^:\/\/])+\:\/\/[\w-]+\.[\w-.\?\/]+$/" , $url );
}
else
{
$status =  filter_var( $url , FILTER_VALIDATE_URL );
}

return $status;
}

补充:利用php自带函数来操作。

php验证邮箱

 代码如下 复制代码

<?php
$email = 'fengdingbo@gmail.com';                                               
$result = filter_var($email, FILTER_VALIDATE_EMAIL);
var_dump($result); // string(20) "fengdingbo@gmail.com"

php验证url地址

 代码如下 复制代码

<?php
$url = "http://www.111cn.net";
$result = filter_var($url, FILTER_VALIDATE_URL);
var_dump($result); // string(25) "http://www.111cn.net"

php验证ip地址

 代码如下 复制代码

<?php
$url = "192.168.1.110";                                                        
$result = filter_var($url, FILTER_VALIDATE_IP);
var_dump($result); // string(13) "192.168.1.110"
// 该方法也可以用来验证ipv6。
$url = "2001:DB8:2de::e13";                                                    
$result = filter_var($url, FILTER_VALIDATE_IP);
var_dump($result); // string(17) "2001:DB8:2de::e13"

在开发网站的时候,有时我们为了友好的提示用户输入的网址不存在,用设置一个 404 错误页面。设置 404 还有一个好处就是防止恶意用户猜测你的url参数。本文我们来讲讲用php及apache设置404错误页面的方法。

在php程序中,我们也经常需要考虑如何用php实现页面404跳转的写法,下面作者将如何用php进行404转向的写法和大家分享一下!

 代码如下 复制代码
// 直接输出页面错误信息
@header("http/1.1 404 not found");
@header("status: 404 not found");
echo 'echo 404';
exit();



或者:

 代码如下 复制代码
// 跳转到错误页面,推荐使用这种方法
// 注意include文件的路径不能是http网络路径
@header("http/1.1 404 not found");
@header("status: 404 not found");
include("/404.html");
exit();




我们也可以直接在 apache 设置 404 错误页面,具体定义方法如下:
 
在网站的根目录下新建一个 .htaccess 文件,然后在该文件中加入如下内容即可:

 代码如下 复制代码
ErrorDocument 404 http://www.phpernote.com/404.html




查看404是否设置成功可以利用 firefox 的 firebug 插件来查看,具体查看方法如下:

在已经安装firebug的情况下,用firefox浏览器打开要检查404状态码的页面,点击右下角小虫的图标,启动"网络"标签,依次打开"网络–所有/html–headers";如果一切正常,你就可以看到包括headers、响应在内的各项页面参数了。

标签:[!--infotagslink--]

您可能感兴趣的文章: