站三界导航
首页 PHP代码
  • php常用抽奖概率算法(抽奖,大转盘,广告首选)
    php常用抽奖概率算法(抽奖,大转盘,广告首选)

    算法一/***全概率计算**@paramarray$parray('a'=>0.5,'b'=>0.2,'c'=>0.4)*@returnstring返回上面数组的key*/functionrandom($ps){static$arr=array();$key=md5(serialize($ps));if(!isset($arr[$key])){$max=array_sum($ps);foreach($psas$k=>$v){$v=$v/$max*10000;for($i=0;$i<$v;$i++)$arr[$key][]=$k;}}return$arr[$key][mt_rand(0,count($arr[$key])-1)];}算法二functionget_rand($proArr){$result='';//概率数组的总概率精度$proSum=array_sum($proArr);//概率数组循环foreach($proArras$key=>$proCur){$randNum=mt_rand(1,$proSum);if($randNum<=$proCur){$result=$key;break;}else{$proSum-=$proCur;}}unset($proArr);return$result;}算法二是一段经典的概率算法,$proArr是一个预先设置的数组,假设数组为:array(100,200,300,400),开始是从1,1000这个概率范围内筛选第一个数是否在他的出现概率范围之内,如果不在,则将概率空减,也就是k的值减去刚刚的那个数字的概率空间,在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。这样筛选到最终,总会有一个数满足要求。就相当于去一个箱子里摸东西,第一个不是,第二个不是,第三个还不是,那最后一个一定是。这个算法简单,而且效率非常高,关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。接下来我们通过PHP配置奖项。$prize_arr=array('0'=>array('id'=>1,'prize'=>'平板电脑','v'=>1),'1'=>array('id'=>2,'prize'=>'数码相机','v'=>5),'2'=>array('id'=>3,'prize'=>'音箱设备','v'=>10),'3'=>array('id'=>4,'prize'=>'4G优盘','v'=>12),'4'=>array('id'=>5,'prize'=>'10Q币','v'=>22),'5'=>array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),);$prize_arr是一个二维数组,记录了所有本次抽奖的奖项信息,其中id表示中奖等级,prize表示奖品,v表示中奖概率。注意其中的v必须为整数,你可以将对应的奖项的v设置成0,即意味着该奖项抽中的几率是0,数组中v的总和(基数),基数越大越能体现概率的准确性。本例中v的总和为100,那么平板电脑对应的中奖概率就是1%,如果v的总和是10000,那中奖概率就是万分之一了。每次前端页面的请求,PHP循环奖项设置数组,通过概率计算函数get_rand获取抽中的奖项id。将中奖奖品保存在数组$res['yes']中,而剩下的未中奖的信息保存在$res['no']中,最后输出json个数数据给前端页面。//如果中奖数据是放在数据库里,这里就需要进行判断中奖数量//在中1、2、3等奖的,如果达到最大数量的则unset相应的奖项,避免重复中大奖//codehereeg:unset($prize_arr['0'])foreach($prize_arras$key=>$val){$arr[$val['id']]=$val['v'];}$rid=get_rand($arr);//根据概率获取奖项id$res['yes']=$prize_arr[$rid-1]['prize'];//中奖项//将中奖项从数组中剔除,剩下未中奖项,如果是数据库验证,这里可以省掉unset($prize_arr[$rid-1]);shuffle($prize_arr);//打乱数组顺序for($i=0;$i<count($prize_arr);$i++){$pr[]=$prize_arr[$i]['prize'];}$res['no']=$pr;echojson_encode($res);为什么总是抽不到大奖呢?在很多类似的抽奖活动中,参与者往往抽不到大奖,举个例子,假如我是抽奖活动的主办方,我设置了6个奖项,每个奖项不同的中奖概率,假如一等奖是一台高级轿车,可是我设置了其中奖概率为0,这意味着什么?这意味着参与抽奖者无论怎么抽,永远也得不到这台高级轿车。而当主办方每次翻动剩下的方块时,参与者会发现一等奖也许就在刚刚抽奖的方块旁边的一个数字下,都怪自己运气差。真的是运气差吗?其实在参与者翻动那个方块时程序已经决定了中奖项,而翻动查看其他方块看到的奖项只是一个烟雾弹,迷惑了观众和参与者。我想看完这篇文章后,您或许会知道电视节目中的翻板抽奖猫腻了,您也许大概再不会去机选双色球了。

    • PHP代码
    • 156阅读
    • 2022-05-04

  • php 实现抽奖功能代码
    php 实现抽奖功能代码

    <?phpfunctionget_rand($proArr){$result='';//概率数组的总概率精度$proSum=array_sum($proArr);//计算数组中元素的和//概率数组循环foreach($proArras$key=>$proCur){$randNum=mt_rand(1,$proSum);if($randNum<=$proCur){//如果这个随机数小于等于数组中的一个元素,则返回数组的下标$result=$key;break;}else{$proSum-=$proCur;}}unset($proArr);return$result;}这里是我们的奖品内容:$prize_arr=array('0'=>array('id'=>1,'prize'=>'火箭','v'=>1),'1'=>array('id'=>2,'prize'=>'飞机','v'=>5),'2'=>array('id'=>3,'prize'=>'奔驰','v'=>10),'3'=>array('id'=>4,'prize'=>'宝马','v'=>12),'4'=>array('id'=>5,'prize'=>'奥托','v'=>22),'5'=>array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),);foreach($prize_arras$key=>$val){$arr[$val['id']]=$val['v'];//将$prize_arr放入数组下标为$prize_arr的id元素,值为v元素的数组中}//print_r($arr);die;$rid=get_rand($arr);//根据概率获取奖项id$res['yes']=$prize_arr[$rid-1]['prize'];//获取中奖项unset($prize_arr[$rid-1]);//将中奖项从数组中剔除,剩下未中奖项shuffle($prize_arr);//打乱数组顺序for($i=0;$i<count($prize_arr);$i++){$pr[]=$prize_arr[$i]['prize'];}$res['no']=$pr;print_r($res);

    • PHP代码
    • 161阅读
    • 2022-05-04

  • 7个超级实用的PHP代码片段
    7个超级实用的PHP代码片段

    1、超级简单的页面缓存如果你的工程项目不是基于CMS系统或框架,打造一个简单的缓存系统将会非常实在。下面的代码很简单,但是对小网站而言能切切实实解决问题。<?php//definethepathandnameofcachedfile$cachefile='cached-files/'.date('M-d-Y').'.php';//definehowlongwewanttokeepthefileinseconds.Isetmineto5hours.$cachetime=18000;//Checkifthecachedfileisstillfresh.Ifitis,serveitupandexit.if(file_exists($cachefile)&&time()-$cachetime<filemtime($cachefile)){include($cachefile);exit;}//ifthereiseithernofileORthefiletotooold,renderthepageandcapturetheHTML.ob_start();?><html>outputallyourhtmlhere.</html><?php//We'redone!Savethecachedcontenttoafile$fp=fopen($cachefile,'w');fwrite($fp,ob_get_contents());fclose($fp);//finallysendbrowseroutputob_end_flush();?>2、在PHP中计算距离这是一个非常有用的距离计算函数,利用纬度和经度计算从A地点到B地点的距离。该函数可以返回英里,公里,海里三种单位类型的距离。functiondistance($lat1,$lon1,$lat2,$lon2,$unit){$theta=$lon1-$lon2;$dist=sin(deg2rad($lat1))*sin(deg2rad($lat2))+cos(deg2rad($lat1))*cos(deg2rad($lat2))*cos(deg2rad($theta));$dist=acos($dist);$dist=rad2deg($dist);$miles=$dist*60*1.1515;$unit=strtoupper($unit);if($unit=="K"){return($miles*1.609344);}elseif($unit=="N"){return($miles*0.8684);}else{return$miles;}}echodistance(32.9697,-96.80322,29.46786,-98.53506,"k")."kilometers";3、将秒数转换为时间(年、月、日、小时…)这个有用的函数能将秒数表示的事件转换为年、月、日、小时等时间格式。functionSec2Time($time){if(is_numeric($time)){$value=array("years"=>0,"days"=>0,"hours"=>0,"minutes"=>0,"seconds"=>0,);if($time>=31556926){$value["years"]=floor($time/31556926);$time=($time%31556926);}if($time>=86400){$value["days"]=floor($time/86400);$time=($time%86400);}if($time>=3600){$value["hours"]=floor($time/3600);$time=($time%3600);}if($time>=60){$value["minutes"]=floor($time/60);$time=($time%60);}$value["seconds"]=floor($time);return(array)$value;}else{return(bool)FALSE;}}4、强制下载文件一些诸如mp3类型的文件,通常会在客户端浏览器中直接被播放或使用。如果你希望它们强制被下载,也没问题。可以使用以下代码:functiondownloadFile($file){$file_name=$file;$mime='application/force-download';header('Pragma:public');//requiredheader('Expires:0');//nocacheheader('Cache-Control:must-revalidate,post-check=0,pre-check=0');header('Cache-Control:private',false);header('Content-Type:'.$mime);header('Content-Disposition:attachment;filename="'.basename($file_name).'"');header('Content-Transfer-Encoding:binary');header('Connection:close');readfile($file_name);//pushitoutexit();}5、使用GoogleAPI获取当前天气信息想知道今天的天气?这段代码会告诉你,只需3行代码。你只需要把其中的ADDRESS换成你期望的城市。$xml=simplexml_load_file('http://www.google.com/ig/api?weather=ADDRESS');$information=$xml->xpath("/xml_api_reply/weather/current_conditions/condition");echo$information[0]->attributes();6、获得某个地址的经纬度随着GoogleMapsAPI的普及,开发人员常常需要获得某一特定地点的经度和纬度。这个非常有用的函数以某一地址作为参数,返回一个数组,包含经度和纬度数据。functiongetLatLong($address){if(!is_string($address))die("AllAddressesmustbepassedasastring");$_url=sprintf('http://maps.google.com/maps?output=js&q=%s',rawurlencode($address));$_result=false;if($_result=file_get_contents($_url)){if(strpos($_result,'errortips')>1||strpos($_result,'Didyoumean:')!==false)returnfalse;preg_match('!center:\s*{lat:\s*(-?\d+\.\d+),lng:\s*(-?\d+\.\d+)}!U',$_result,$_match);$_coords['lat']=$_match[1];$_coords['long']=$_match[2];}return$_coords;}

    • PHP代码
    • 193阅读
    • 2022-05-04

  • php获取当前域名的方法
    php获取当前域名的方法

    1、(用php自带系统变量得到当前域名)   不支持系统变量的主机无法获得,只能获得当前网页的域名echo$_SERVER['HTTP_HOST'];2、(用自带函数获取域名)$url='https://www.zhansanjie.com';   $arr_url=parse_url($url);   echo$arr_url['host'];3、(使用正则表达式来匹配出域名)preg_match("/^(http://)?([^/]+)/i",$url,$arr_domain);   echo$arr_domain[2];

    • PHP代码
    • 166阅读
    • 2022-05-04

  • php数组转换对象方法
    php数组转换对象方法

    php虽然不能像js那样直接newObject,但php支持匿名类我们直接新建匿名类进行转换就好了protectedfunctionarrayTransitionObject(Array$array){if(is_array($array)){$obj=newclass{};foreach($arrayas$key=>$val){$obj->$key=$val;}}else{$obj=$array;}return$obj;}

    • PHP代码
    • 163阅读
    • 2022-05-04

  • PHP中的11个魔术方法
    PHP中的11个魔术方法

    1、__get、__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get($property)    当调用一个未定义的属性时访问此方法__set($property,$value)  给一个未定义的属性赋值时调用这里的没有声明包括访问控制为proteced,private的属性(即没有权限访问的属性)2、__isset、__unset__isset($property)当在一个未定义的属性上调用isset()函数时调用此方法__unset($property)当在一个未定义的属性上调用unset()函数时调用此方法与__get方法和__set方法相同,这里的没有声明包括访问控制为proteced,private的属性(即没有权限访问的属性)3、__call__call($method,$arg_array)当调用一个未定义(包括没有权限访问)的方法是调用此方法4、__autoload__autoload函数,使用尚未被定义的类时自动调用。通过此函数,脚本引擎在PHP出错失败前有了最后一个机会加载所需的类。注意:在__autoload函数中抛出的异常不能被catch语句块捕获并导致致命错误。5、__construct、__destruct__construct构造方法,当一个对象被创建时调用此方法,好处是可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么,这样你在改变类的名称时,就不需要改变构造方法的名称__destruct析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.,析构函数允许你在使用一个对象之后执行任意代码来清除内存,当PHP决定你的脚本不再与对象相关时,析构函数将被调用.,在一个函数的命名空间内,这会发生在函数return的时候,对于全局变量,这发生于脚本结束的时候,如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值,通常将变量赋值勤为NULL或者调用unset。6、__clonePHP5中的对象赋值是使用的引用赋值,使用clone方法复制一个对象时,对象会自动调用__clone魔术方法,如果在对象复制需要执行某些初始化操作,可以在__clone方法实现。7、__toString __toString方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时,如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchablefatalerror:Objectofclasstestcouldnotbeconvertedtostringin,此方法必须返回一个字符串。在PHP5.2.0之前,__toString方法只有结合使用echo()或print()时才能生效。PHP5.2.0之后,则可以在任何字符串环境生效(例如通过printf(),使用%s修饰符),但不能用于非字符串环境(如使用%d修饰符)。从PHP5.2.0,如果将一个未定义__toString方法的对象转换为字符串,会报出一个E_RECOVERABLE_ERROR错误。8、__sleep、__wakeup__sleep串行化的时候用__wakeup反串行化的时候调用serialize()检查类中是否有魔术名称__sleep的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。使用__sleep的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。相反地,unserialize()检查具有魔术名称__wakeup的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。使用__wakeup的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。9、__set_state当调用var_export()时,这个静态方法会被调用(自PHP5.1.0起有效)。本方法的唯一参数是一个数组,其中包含按array(’property’=>value,…)格式排列的类属性。10、__invoke当尝试以调用函数的方式调用一个对象时,__invoke方法会被自动调用。PHP5.3.0以上版本有效11、__callStatic它的工作方式类似于__call()魔术方法,__callStatic()是为了处理静态方法调用,PHP5.3.0以上版本有效,PHP确实加强了对__callStatic()方法的定义;它必须是公共的,并且必须被声明为静态的。同样,__call()魔术方法必须被定义为公共的,所有其他魔术方法都必须如此。

    • PHP代码
    • 187阅读
    • 2022-05-04

  • PHP下载远程图片的几种方法总结
    PHP下载远程图片的几种方法总结

    PHP下载远程图片的几种方法总结本文演示3个从远程URL下载图片,并保存到本地文件中的方法,包括file_get_contents,curl和fopen。1、使用file_get_contentsfunctiondlfile($file_url,$save_to){$content=file_get_contents($file_url);file_put_contents($save_to,$content);}2、使用CURLfunctiondlfile($file_url,$save_to){$ch=curl_init();curl_setopt($ch,CURLOPT_POST,0);curl_setopt($ch,CURLOPT_URL,$file_url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);$file_content=curl_exec($ch);curl_close($ch);$downloaded_file=fopen($save_to,'w');fwrite($downloaded_file,$file_content);fclose($downloaded_file);}3、使用fopenfunctiondlfile($file_url,$save_to){$in=fopen($file_url,"rb");$out=fopen($save_to,"wb");while($chunk=fread($in,8192)){fwrite($out,$chunk,8192);}fclose($in);fclose($out);}下载与保存完整方法(输出日志那行可删除):privatefunctiondownloadImage($url){$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,30);$file=curl_exec($ch);curl_close($ch);$this->saveAsImage($url,$file);}privatefunctionsaveAsImage($url,$file){$filename=pathinfo($url,PATHINFO_BASENAME);$dirname=pathinfo(parse_url($url,PHP_URL_PATH),PATHINFO_DIRNAME);$path='public'.$dirname.'/';$fullpath='public'.$dirname.'/'.$filename;//如果目录不存在,则创建if(!is_dir($path)){mkdir($path,0777,true);}if(file_exists($fullpath)){//$this->output->writeln("【已存在】输出路径".$fullpath);}else{$resource=fopen($fullpath,'a');fwrite($resource,$file);fclose($resource);//$this->output->writeln("【已保存】输出路径".$fullpath);}}

    • PHP代码
    • 152阅读
    • 2022-05-04

  • PHP中 Public、Private、Protect 的使用方法及区别
    PHP中 Public、Private、Protect 的使用方法及区别

    public【公共的】可以在程序中的任何位置(类内、类外)被其他的类和对象调用。子类可以继承和使用父类中所有的公共成员。Private【私有的】被private修饰的变量和方法,只能在所在的类的内部被调用和修改,不可以在类的外部被访问。在子类中也不可以。如果直接调用,就会发生错误。Protect【受保护的】用protected修饰的类成员,可以在本类和子类中被调用,但是在其他地方不能被调用。

    • PHP代码
    • 148阅读
    • 2022-05-04

  • php生成空对象的两种方法
    php生成空对象的两种方法

    最基本的php中生成类,首先就要先定义类,包括成员变量和成员方法等,还要设计构造函数给成员变量赋值。有没有一种快捷的方式,能够迅速创建出空对象,并对对象的成员变量赋值。下面提供两种迅速生成空对象的方式,然后迅速对对象赋值。方法1.定义空类,空类生成空对象,然后对对象的成员变量赋值方法2.使用stdClass直接生成空对象下面附代码:<?php//php创建空类的两种方法//方法1.classCfg{}$girl=newCfg();$girl->name='tom';echo$girl->name."</br>";//方法2.$boy=newstdClass();$boy->name="lucky";echo$boy->name."</br>";

    • PHP代码
    • 158阅读
    • 2022-05-04

  • php方法 隐藏手机号中间四位
    php方法 隐藏手机号中间四位

    $num="13966778888"$str=substr_replace($num,'****',3,4);自定义函数手机号隐藏中间四位functionyc_phone($str){$str=$str;$resstr=substr_replace($str,'****',3,4);return$resstr;}

    • PHP代码
    • 152阅读
    • 2022-05-04

站三界导航
本站声明:本站严格遵守国家相关法律规定,非正规网站一概不予收录。本站所有资料取之于互联网,任何公司或个人参考使用本资料请自辨真伪、后果自负,站三界导航不承担任何责任。在此特别感谢您对站三界导航的支持与厚爱。