PHP全排列算法实现程序代码

 更新时间:2016年11月25日 15:37  点击:1325
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

简介

如1,2,3三个元素的全排列为:

1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1

共3*2*1=6种 3!

2公式

全排列数f(n)=n!(定义0!=1)

递归算法

1,2,3
1,3,2
2,1,3
2,3,1
3,2,1
3,1,2

这是由于算法只是考虑到了如何输出全排列,而没有考虑到换位是否有问题。所以我提出了解决方案,就是换位函数修改下
如 1 2 3 换位的话 ,不应该直接 3 2 1这样 ,让3和1直接换位; 而是让3排在最前后 ,1 2 依次向后

基本算法

以下介绍全排列算法四种:
(A)字典序法
(B)递增进位制数法
(C)递减进位制数法
(D)邻位对换法

实现全排列算法

 代码如下 复制代码

<?php

header("content-type:text/html;charset=utf-8");/**
 * @param array $a 待排列的元素集合,会动态变化
 * @param array $b 储存当前排列
 * @param array $M 待排列的元素集合,相当于一个常量,始终为初始待排列的元素集合
 */
function wholerange($a,$b,$M){
 $range=array();
 if(count($a) > 1){
  $d=$b;
  foreach($a as $value){
   $b[]=$value;
   $c=array_diff($M,$b);
   if(count($c) > 0){
    $range[]=wholerange($c,$b,$M);
   }
   $b=$d;
  }
 }elseif(count($a) == 1){
  foreach($a as $value){
   $b[]=$value;
  }
  $onerange="";
  foreach($b as $value){
   $onerange.=$value;
  }
  $range[]=$onerange;
 }
 return $range;
}
/**
 * 递归输出数组
 *
 * @param array $arr 待输出的数组
 * @return int 返回数组元素个数*/
function recursionarray($arr){
 $i=0;
 foreach($arr as $value){
  if(is_array($value)){
   $i+=recursionarray($value);
  }else{
   echo $value."<br/>";
   $i++;
  }
 }
 return $i;
}
$a=array('A','B','C','D');
$b=array();
$range=wholerange($a,$b,$a);
$count=recursionarray($range);
echo "总共有".$count."排列";
?>

文章为各位初学php的朋友提供一篇关于php 矩阵转置 求素数 冒泡排序 选择排序例子,希望这个例子可以帮助到各位朋友哦。

关于矩阵转置:矩阵是指纵横排列的二维数据表格

关于求素数:质数公式,又称素数公式,在数学领域中,表示一种能够仅产生质数(素数)的公式。即是说,这个公式能够一个不漏地产生所有的质数,并且对每个输入的值,此公式产生的结果都是质数。由于质数的个数是可数的,因此一般假设输入的值是自然数集(或整数集及其它可数集)。迄今为止,人们尚未找到易于计算且符合上述条件的质数公式,但对于质数公式应该具备的性质已经有了大量的了解

冒泡选择排序:是两种排序方法就不介绍了

例子

 代码如下 复制代码

<?php
header("content-type:text/html;charset=utf-8");
/**
 *
 * PHP版数据结构基本算法
 * 1.矩阵转置
 * 2.求素数
 * 3.冒泡排序
 * 4.选择排序
 *//**
 * 矩阵转置
 *
 * @param array $matrix 待转置的矩阵
 * @param array return 转置后的矩阵
 * */
function transposition($matrix){
 $i=0;
 $j=0;
 foreach($matrix as $line){
  foreach($line as $element){
   $tm[$j++][$i]=$element;
  }
  $j=0;
  $i++;
 }
 return $tm;
}
$matrix=array(
 array(1,2,3,'a'),
 array(4,5,6,'b'),
 array(7,8,9,'c'),
);
echo "<br/>转置前的矩阵:";
foreach($matrix as $line){
 echo "<br/>";
 foreach($line as $value){
  echo $value."&nbsp;&nbsp;";
 }
}
$tm=transposition($matrix);
echo "<br/>转置后的矩阵:";
foreach($tm as $line){
 echo "<br/>";
 foreach($line as $element){
  echo $element."&nbsp;&nbsp;";
 }
}/**
 * 求素数
 *@param int  $n 求2~$n内的所有素数
 *@return array 返回2~$n所有的素数集合
 **/
function primenumber($n){
 $i=3;
 $prime=array(2);
 $tag=true;
 while($i<=$n){
  foreach($prime as $value){
   if($i % $value == 0){
    $tag=false;
    break;
   }
   $tag=true;
  }
  if($tag){
   $prime[]=$i;
  }
  $i++;
 }
 return $prime;
}
$n=200;
$prime=primenumber($n);
echo "<br />2~{$n}内的素数有:<br />";
foreach($prime as $value){
 echo $value."&nbsp;&nbsp;";
}/**
 * 冒泡排序
 *
 *@param array $data 待排序的数组
 *@param int $tag 0表示由小到大排序,1表示由大到小排序
 *@param array 排序后的结果
 **/
function bubblingsort($data,$tag=0){
 $arrlen=count($data);
 for($i=$arrlen-1;$i>=0;$i--){
  for($j=0;$j<$i;$j++){
   if($data[$i] > $data[$j]){
    if($tag == 1){
     $m=$data[$j];
     $data[$j]=$data[$i];
     $data[$i]=$m;
    }
   }else{
    if($tag == 0){
     $m=$data[$i];
     $data[$i]=$data[$j];
     $data[$j]=$m;
    }
   }
  }
 }
 return $data;
}
$data=array(34,22,2,56,90);
echo "<br/>冒泡排序前:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
$data=bubblingsort($data);
echo "<br/>由小到大排序后:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
$data=bubblingsort($data,1);
echo "<br/>由大到小排序后:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
/**
 * 选择排序
 *
 *@param array $data 待排序的数组
 *@param int $tag 0表示由小到大排序,1表示由大到小排序
 *@param array 排序后的结果
 **/
function selectsort($data,$tag=0){
 $arrlen=count($data);
 for($i=0;$i<$arrlen-1;$i++){
  for($j=$i+1;$j<$arrlen;$j++){
   if($data[$i] > $data[$j]){
    if($tag == 0){
     $m=$data[$i];
     $data[$i]=$data[$j];
     $data[$j]=$m;
    }
   }else{
    if($tag == 1){
     $m=$data[$i];
     $data[$i]=$data[$j];
     $data[$j]=$m;
    }
   }
  }
 }
 return $data;
}
$data=array(34,22,2,56,90);
echo "<br/>选择排序前:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
$data=selectsort($data);
echo "<br/>由小到大排序后:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
$data=selectsort($data,1);
echo "<br/>由大到小排序后:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
?>

PDO(PHP数据对象) 是一个轻量级的、具有兼容接口的PHP数据连接拓展,是一个PHP官方的PECL库,随PHP 5.1发布,需要PHP 5的面向对象支持,因而在更早的版本上无法使用,下面我们一起来了解一下PHP PDO配置及使用方法

PDO(PHP Data Object)扩展在PHP5中加入,PHP6中将默认识用PDO连接数据库,所有非PDO扩展将会在PHP6被从扩展中移除。该扩展提供PHP内置类 PDO来对数据库进行访问,不同数据库使用相同的方法名,解决数据库连接不统一的问题。
我是配置在windows下做开发用的。
PDO的目标提供一种轻型、清晰、方便的 API统一各种不同 RDBMS 库的共有特性,但不排除更高级的特性。
通过 PHP 脚本提供可选的较大程度的抽象/兼容性。
PDO的特点:性能。PDO 从一开始就吸取了现有数据库扩展成功和失败的经验教训。因为 PDO 的代码是全新的,所以我们有机会重新开始设计性能,以利用 PHP 5 的最新特性。
能力。
PDO 旨在将常见的数据库功能作为基础提供,同时提供对于 RDBMS 独特功能的方便访问。
简单。
PDO 旨在使您能够轻松使用数据库。API 不会强行介入您的代码,同时会清楚地表明每个函数调用的过程。
运行时可扩展。

PDO 扩展是模块化的,使您能够在运行时为您的数据库后端加载驱动程序,而不必重新编译或重新安装整个 PHP 程序。例如,PDO_OCI 扩展会替代 PDO 扩展实现 Oracle 数据库 API。还有一些用于 MySQL、PostgreSQL、ODBC 和 Firebird 的驱动程序,更多的驱动程序尚在开发。■

安装PDO

版本要求:

php5.1以及以后版本的程序包里已经带了;
php5.0.x则要到pecl.php.net下载,放到你的扩展库,就是PHP所在的文件夹的ext文件夹下;
手册上说5.0之前的版本不能运行PDO扩展。

配置(Windows):

修改你的php.ini配置文件,使它支持pdo.(php.ini这个东西没有弄懂的话,先弄清楚,要修改调用你的phpinfo()函数所显示的那个php.ini)

extension=php_pdo.dll前面的分号去掉,分毫是php配置文件注释符号,这个扩展是必须的。

往下还有

;extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_informix.dll
;extension=php_pdo_mssql.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll

找到extension=php_pdo.dll 和 extension=php_pdo_mysql.dll ,去掉前面“;”的注释,修改后的两行配置内容如下:

extension=php_pdo.dll
extension=php_pdo_mysql.dll

各各扩展所对应的数据库是:

Driver name Supported databases
PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD Firebird/Interbase 6
PDO_INFORMIX IBM Informix Dynamic Server
PDO_MYSQL MySQL 3.x/4.x
PDO_OCI Oracle Call Interface
PDO_ODBC ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
PDO_PGSQL PostgreSQL
PDO_SQLITE SQLite 3 and SQLite 2

你要使用哪种数据库,只要把相应的扩展前的注释符号”;”去掉就可以了。


配置(Linux):

编译PHP时加上:

--enable-pdo --with-pdo-sqlite --with-pdo-mysql=/usr/local/mysql/bin/mysql_config


重启apache或iis,搞一个测试页,里面就phpinfo函数,可查看PDO模块是否开启。


使用PDO(Mysql 数据库举例)

数据库的连接:

我们通过下面的例子来分析PDO连接数据库,建立一个 PDO_config.php 文件,使用的时候直接 include 一下:
<?php
//数据库类型 Oracle 用 OCI ,对于开发者来说,使用不同的数据库只要改这个:
$dbms   = 'mysql';
$host   = 'localhost';
//数据库主机名
$dbName = 'test_test_test';
//使用的数据库
$user   = 'root';
//数据库连接用户名
$pass   = ' ';
//对应的密码
$dsn    = "$dbms:host=$host; dbname=$dbName";

try{

//初始化一个PDO对象,就是创建了数据库连接对象 $dbh:
 $dbh = new PDO($dsn, $user, $pass);
//echo "连接成功<br/>"; /*你还可以进行一次搜索操作
 foreach($dbh->query('SELECT * from FOO')as$row){
  print_r($row);
  //你可以用 echo($GLOBAL); 来看到这些值

 }
 $dbh = null;
}catch(PDOException$e){
 die("Error!: ".$e->getMessage()."<br/>");
}
/*
默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
$db=newPDO($dsn,$user,$pass,array(PDO::ATTR_PERSISTENT=>true));
*/
$db = new PDO($dsn, $user, $pass);
//创建数据库连接对象 $db
?>

数据库查询:

上面我们已经进行了一次查询,我们还可以使用如下的查询:
<?php
include("./PDO_config.php");

$db -> setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);

//设置属性
$rs = $db->query("SELECT * FROM yourtable");
$rs -> setFetchMode(PDO::FETCH_ASSOC);
$result_arr = $rs -> fetchAll();

//获取所有记录集到一个变量中
print_r($result_arr);

?>

以上因为用到setAttribute()方法,放上那两个参数,把字段名强制转换成大写。

下面列出多有PDO::setAttribute()的参数:

PDO::ATTR_CASE:
强制列名变成一种格式,详细如下(第二个参数):
PDO::CASE_LOWER
强制列名是小写.
PDO::CASE_NATURAL
列名按照原始的方式
PDO::CASE_UPPER
强制列名为大写
PDO::ATTR_ERRMODE
错误提示
PDO::ERRMODE_SILENT
不显示错误信息,只显示错误码
PDO::ERRMODE_WARNING
显示警告错误
PDO::ERRMODE_EXCEPTION
抛出异常
PDO::ATTR_ORACLE_NULLS(不仅仅是ORACLE有效,别的数据库也有效): )
指定数据库返回的NULL值在php中对应的数值
PDO::NULL_NATURAL:
不变.
PDO::NULL_EMPTY_STRING
Empty string is converted toNULL
PDO::NULL_TO_STRING
NULL is converted to an empty string
PDO::ATTR_STRINGIFY_FETCHES
Convert numeric values to strings when fetching. Requiresbool.
PDO::ATTR_STATEMENT_CLASS
Set user-supplied statement class derived from PDOStatement. Cannot be used with persistent PDO instances. Requiresarray(string classname, array(mixed constructor_args)).
PDO::ATTR_AUTOCOMMIT(available in OCI, Firebird and MySQL)
Whether to autocommit every single statement.
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(available in MySQL)
Use buffered queries.

例子中的

$rs->setFetchMode(PDO::FETCH_ASSOC);
是PDOStatement::setFetchMode(),对返回类型的声明。

有如下:

PDO::FETCH_ASSOC– 关联数组形式
PDO::FETCH_NUM — 数字索引数组形式
PDO::FETCH_BOTH — 两者数组形式都有,这是缺省的
PDO::FETCH_OBJ — 按照对象的形式,类似于以前的 mysql_fetch_object()更多返回类型声明(PDOStatement::方法名)看手册。★插入,更新,删除数据,
$db->exec(”DELETE FROM `xxxx_menu` where mid=43″);简单的总结一下上面的操作:查询操作主要是PDO::query()、PDO::exec()、PDO::prepare()
PDO::query()主要是用于有记录结果返回的操作,特别是SELECT操作,
PDO::exec()主要是针对没有结果集合返回的操作,比如INSERT、UPDATE、DELETE等操作,它返回的结果是当前操作影响的列数。
PDO::prepare()主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句,这个方法可以绑定参数,功能比较强大,不是本文能够简单说明白的,大家可以参考手册和其他文档。获取结果集操作主要是:PDOStatement::fetchColumn()、PDOStatement::fetch()PDOStatement::fetchALL()。
PDOStatement::fetchColumn()是获取结果指定第一条记录的某个字段,缺省是第一个字段。
PDOStatement::fetch()是用来获取一条记录,
PDOStatement::fetchAll()是获取所有记录集到一个中,获取结果可以通过PDOStatement::setFetchMode来设置需要结果集合的类型。另外有两个周边的操作,一个是PDO::lastInsertId()和PDOStatement::rowCount()。PDO::lastInsertId()是返回上次插入操作,主键列类型是自增的最后的自增ID。
PDOStatement::rowCount()主要是用于PDO::query()和PDO::prepare()进行DELETE、INSERT、UPDATE操作影响的结果集,对PDO::exec()方法和SELECT操作无效。
事务和自动提交至此,您已经通过 PDO 连接到了 mysql,在发出查询之前,您应该理解 PDO 是如何管理事务的。如果之前没有接触过事务,那么首先要知道事务的 4 个特征:原子性(Atomicity)、一致性(Consistency)、独立性(Isolation)和持久性(Durability),即 ACID。用外行人的话说,对于在一个事务中执行的任何工作,即使它是分阶段执行的,也一定可以保证该工作会安全地应用于数据库,并且在工作被提交时,不会受到来自其他连接的影响。事务性工作可以根据请求自动撤销(假设您还没有提交它),这使得脚本中的错误处理变得更加容易。
事务通常是通过把一批更改积蓄起来、使之同时生效而实现的。这样做的好处是可以大大提高这些更新的效率。换句话说,事务可以使脚本更快,而且可能更健壮(不过需要正确地使用事务才能获得这样的好处)。
不幸的是,并不是每种数据库都支持事务(Mysql5支持事务,mysql4我不知道),所以当第一次打开连接时,PDO 需要在所谓的“自动提交(auto-commit)”模式下运行。自动提交模式意味着,如果数据库支持事务,那么您所运行的每一个查询都有它自己的隐式事务,如果数据库不支持事务,每个查询就没有这样的事务。如果您需要一个事务,那么必须使用 PDO::beginTransaction() 方法来启动一个事务。如果底层驱动程序不支持事务,那么将会抛出一个 PDOException(无论错误处理设置是怎样的:这总是一个严重错误状态)。在一个事务中,可以使用 PDO::commit() 或 PDO::rollBack() 来结束该事务,这取决于事务中运行的代码是否成功。
当脚本结束时,或者当一个连接即将被关闭时,如果有一个未完成的事务,那么 PDO 将自动回滚该事务。这是一种安全措施,有助于避免在脚本非正常结束时出现不一致的情况 —— 如果没有显式地提交事务,那么假设有某个地方会出现不一致,所以要执行回滚,以保证数据的安全性。

在 PHP 中以两个下划线开头的方法,__construct(), __destruct (), __call(), __callStatic(),__get(), __set(), __isset(), __unset (), __sleep(), __wakeup() 等,被称为"魔术方法"(Magic methods),

集合涵义

在PHP中以两个下划线开头的方法,__construct(), __destruct (), __call(), __callStatic(),__get(), __set(), __isset(), __unset (), __sleep(), __wakeup(), __toString(), __set_state,() __clone() __autoload()等,被称为"魔术方法"(Magic methods)。如果希望PHP调用这些魔术方法,首先必须的类中定义,否则PHP不会执行未创建的魔术方法。[1]
  
注意:PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。


魔术方法中文说明

*PHP面向对象有哪些魔术方法,每个魔术方法如何如何,请写个测试类并运行
*
*__construct($argv1,$argv2,...)
*功能:类的构造方法,作用就是初始化对象
*参数:任意多个,任意类型
*返回值:无
*__destruct()
*功能:类的析构方法,对象被销毁时被调用的,作用是释放内存
*参数:无
*返回值:无
*__get($name)
*功能:当程序试图调用一个未定义或者不可见的成员变量的时候就会自动调用该方法,这个时候程序试图调用*的成员变量的返回值是该方法的返回值;
*参数:$name为试图调用的成员变量的名称,这个参数的传递是PHP自动完成的;
*返回值:类型(不确定)注意该方法可以设置成私有的(构造方法不要设置成私有的)。
*__set($name,$value)魔术方法
*功能:当程序试图给一个未定义或者不可见的成员变量赋值的时候就会自动调用该方法;
*参数:$name,$value分别表示试图赋值的成员变量名称和成员变量的值,这两个参数的传递是PHP自动完成的;
*返回值:这个方法不会返回值 注意该方法可以设置成私有的(构造方法不要设置成私有的)。
*__isset($name)
*功能:当用isset($name)检测一个私有的成员变量的时候就会自动调用该方法,这个时候isset($name)的返回值就
*为该方法的返回值经过转化的布尔值(<除“0”>非空的字符串,非零,true,有单元的数组将会转化为true;0,"0",空*字符串,NULL,没有单元的数组将会转化为false);
*参数:$name为试图检测的成员变量的名称,这个参数的传递是PHP自动完成的;
*返回值:类型(不确定)注意该方法可以设置成私有的(构造方法不要设置成私有的),当用isset()函数检测的是
*公有的成员变量的时候可以直接检测,如果没有__isset()方法而直接检测私有成员会得到不准确的结果即isset()
*会始终返回false;
*__unset($name)
*功能:当用unset($name)撤销一个私有的成员变量的时候就会自动调用该方法;
*参数:$name为试图撤销的成员变量的名称,这个参数的传递是PHP自动完成的;
*返回值:不能返回值,强制返回值将会出错,当用unset()函数撤销的是公有
*的成员变量的时候可以直接撤销,如果没有__unset()方法而直接撤销私有成员不会成功;
*__toString()
*功能:当程度试图输出一个对象类型的变量的时候PHP会自动调用该方法;
*参数:没有参数,如果有会提示出错;
*返回值:字符型(该方法必须通过return返回一个字符串);
*__clone()
*功能:在用clone关键字克隆一个对象的时候PHP会自动调用这个方法,是为了给克隆出来的对象增添自己的属
*性和方法;
*参数:不用传递参数;
*返回值:不用返回值;
*__call($name,$argument)
*功能:当程序试图调用一个不存在的成员方法的时候会自动调用该方法;
*参数:PHP将自动将调用的不存在的方法名传递给$name,不存在的方法中的参数整合为一个数组传递给*$argument;
*返回值:不用返回值;
*__sleep()
功能:使用serialize()函数时,如果实例化的对象中包含__sleep()方法,则会先执行__sleep()方法,该方法可以清除
*对象并返回该对象中所有变量的数组。使用__sleep()方法的目的是关闭对象可能具有的数据库连接等类似的
*善后工作
*参数:无需要传递参数
*返回值:数组类型(Array)该对象中所有变量的数组
*__wakeup()
*功能:使用unserialize()函数重新还原一个被serialize()函数序列化的对象,__wakeup()方法则是恢复序列化中可能
*丢失的数据库连接及相关工作
*参数:无需要传递参数
*返回值:----------------------------
*__set_state($arr)
*功能:可以通过var_export()来访问类的静态方法__set_state(),该方法必须是静态的且必须返回一个对象
*参数:$arr为一个数组
*返回值:为一个对象
*
*__autoload($class_name)
*功能:在指定的路径下自动查找并导入实例化需要使用的类
*参数:$class_name为类名
*返回值:*__callStatic($name,$argument)
*功能:当程序试图在静态方法中调用一个未定义或者不可见的成员方法的时候会自动调用该方法;
*参数:PHP将自动将调用的不存在的方法名传递给$name,不存在的方法中的参数整合为一个数组传递给$argument;
*返回值:不用返回值;*注意:PHP5.3以上的版本支持该魔术方法
*注意:__classStatic()方法必须被申明为public并且为static,否则会产生一个warning错误
*__invoke($x,$y,...)
*功能:当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
*参数:以函数调用方法调用一个对象时传递的任意多个参数
*返回值:不确定*注意:PHP5.3以上的版本支持该魔术方法
**/


魔术方法例子

 

 代码如下 复制代码

class XuDianYang{
 public $sex;
 public $age;
 private $girlfriend='xx';
 public function __construct($sex,$age){
  $this->sex=$sex;
  $this->age=$age;
 }
 public function __get($name){
  echo __class__."::".$name."不存在或者不可见";
 }
 public function __set($name,$value){
  echo __class__."::".$name."由于不在在或者不可见,赋值失败";
 }
 public function __isset($name){
  if(isset($this->$name)){
   echo 1;
  }else{
   echo 0;
  }
 }
 public function __unset($name){
  unset($this->$name);
 }
 public function __toString(){
  return __class__;
 }
 public function __clone(){
  $this->sex='女';
 }
 public function __call($name,$argument){
  echo "方法".__class__."::".$name."不存在";
 }
 public function __sleep(){
  echo "I'm sleeping";
  foreach($this as $key=>$value){
   $arr[]=$key;
  }
  return $arr;
 }
 public function __wakeup(){
  echo "I wake up";
 }
 public function __set_state($arr){
  $obj=new CheShi();
  $obj->var1=$arr['sex'];
  $obj->var2=$arr['age'];
  return $obj;
 }
}
function __autoload($name){
 $class_path="./";
 include_once($class_path.$name.".class.php");
}
$xudianyang=new XuDianYang("男",21);
echo "<br/>";
//正常访问sex属性
echo $xudianyang->sex;
echo "<br/>";
//由于不存在weight属性,将自动调用__get()方法
echo $xudianyang->weight;
echo "<br/>";
//由于不可见(即私有),将自动调用__get()方法
$xudianyang->girlfriend;
echo "<br/>";
//由于不存在,赋值失败,自动调用__set()方法
$xudianyang->shengao="172cm";
echo "<br/>";
//检测sex属性是否存在,由于sex公有直接检测
var_dump(isset($xudianyang->sex));
echo "<br/>";
//检测girlfriend是否存在,由于girlfriend私有,所以自动调用__isset()方法
isset($xudianyang->girlfriend);
echo "<br/>";
//撤消girlfriend,由于girlfriend私有,所以自动调用__unset()方法
//unset($xudianyang->girlfriend);
isset($xudianyang->girlfriend);
echo "<br/>";
//直接输出一个对象,自动调用__toString()方法
echo $xudianyang;
echo "<br/>";
$xu=clone $xudianyang;
echo $xu->sex;
echo "<br/>";
//由于调用不存在的方法,自动调用__call()方法
$xudianyang->walk();
echo "<br/>";
//序列化对象,自动调用__sleep()方法
$a=serialize($xudianyang);
echo "<br/>";
echo "序列化的结果为:".$a;
//反序列化对象,自动调用__wakeup()方法
echo "<br/>";
$b=unserialize($a);
//反序列化的结果
echo $b->sex;
echo "<br/>";
eval('$c='.var_export($xudianyang,true).";");
echo $c->var1;
?>

CheShi.class.php

<?php
class CheShi{
 public $var1;
 public $var2;
}
?>

组合数公式是指从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号c(n,m) 表示,下面我们来看用php来实现。

公式

有时候也表示成:

c(n,m)=p(n,m)/m!=n!/((n-m)!*m!)

2性质

c(n,m)=c(n,n-m);

3递推公式

c(n,m)=c(n-1,m-1)+c(n-1,m)

等式左边表示从n个元素中选取m个元素,而等式右边表示这一个过程的另一种实现方法:任意选择n中的某个备选元素为特殊元素,从n中选m个元素可以由此特殊元素的分成两类情况,即m个被选择元素包含了特殊元素和m个被选择元素不包含该特殊元素。

 代码如下 复制代码

<?php
//实现数学上的组合数算法
header("content-type:text/html;charset=utf-8");
/**
 * 在数组$a中任意m个元素组合
 *
 * @param array $a 候选的集合
 * @param int $n 候选的集合大小
 * @param int $m 组合元素大小
 * @param array $b 储存当前组合中的元素,这里储存的是元素键值
 * @param int $M 相当一个常量,一直保持不变
 * @return */
function combine($a,$n,$m,$b,$M){
 for($i=$n;$i>=$m;$i--){
  $b[$m-1]=$i-1;
  if($m > 1){
   $combine[]=combine($a,$i-1,$m-1,$b,$M);
  }else{
   $onecombine='';
   for($j=$M-1;$j>=0;$j--){
    $onecombine.=$a[$b[$j]];
   }
   $combine[]=$onecombine;
   $onecombine='';
  }
 }
 return $combine;
}
/**
 * 递归输出数组
 *
 * @param array $arr 待输出的数组
 * @return int 返回数组元素个数*/
function recursionarray($arr){
 $i=0;
 foreach($arr as $value){
  if(is_array($value)){
   $i+=recursionarray($value);
  }else{
   echo $value."<br/>";
   $i++;
  }
 }
 return $i;
}
$a=array('A','B','C','D','E','F','G','H','I','J');
$b=array();
$combine=combine($a,10,5,$b,5);
$count=recursionarray($combine);
echo "总共有".$count."组合";
?>

[!--infotagslink--]

相关文章

  • C#几种排序算法

    作者:Sabine 【导读】本文介绍了C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序  冒泡排序 using System; namespace BubbleSorter { public class Bubb...2020-06-25
  • php语言实现redis的客户端

    php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • jQuery+jRange实现滑动选取数值范围特效

    有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   view-source:http://...2016-09-20
  • php 调用goolge地图代码

    <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
  • JS基于Mootools实现的个性菜单效果代码

    本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
  • JS实现的简洁纵向滑动菜单(滑动门)效果

    本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • php 取除连续空格与换行代码

    php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • PHP实现清除wordpress里恶意代码

    公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
  • JS实现双击屏幕滚动效果代码

    本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
  • js识别uc浏览器的代码

    其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
  • jQuery+slidereveal实现的面板滑动侧边展出效果

    我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15
  • JS日期加减,日期运算代码

    一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
  • PHP+jQuery翻板抽奖功能实现

    翻板抽奖的实现流程:前端页面提供6个方块,用数字1-6依次表示6个不同的方块,当抽奖者点击6个方块中的某一块时,方块翻转到背面,显示抽奖中奖信息。看似简单的一个操作过程,却包含着WEB技术的很多知识面,所以本文的读者应该熟...2015-10-21
  • PHP开发微信支付的代码分享

    微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
  • SQLMAP结合Meterpreter实现注入渗透返回shell

    sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25