您的位置:

php排列组合函数,php数组排列函数

本文目录一览:

用php实现排列组合问题

var arr = [];

function f(l,n,s){

if(n==l||n==0){

for(var i=0;il;i++){

s+=n?"1":"0";

}

arr.push(s);

return s;

}else{

f(l-1,n-1,s+"1");

f(l-1,n,s+"0");

}

}

f(4,2,"");

这道题本来是,一个长度为l的二进制数字,其中有n个1,剩下都为0,有多少种组合,放这道题好像可以,最后只要取得arr的长度就行了

var m = 4;

var n = 2;

var s = 0;

function f(m,n){

if(m==n||n==0){

s++;

return false;

}

f(m-1,n-1);

f(m-1,n);

}

f(m,n);

PHP数组排序array_multisort函数详细用法跟排序方法是怎样的?

一、先看最简单的情况。有两个数组:

$arr1 = array(1,9,5);

$arr2 = array(6,2,4);

array_multisort($arr1,$arr2);

print_r($arr1); // 得到的顺序是1,5,9

print_r($arr2); // 得到的顺序是6,4,2

我估计两个数组的值自始至终都是对应着的:1对应6,9对应2,5对应4。

我们再加多一个数组看看会怎样:

$arr1 = array(1,9,5);

$arr2 = array(6,2,4);

$arr3 = array(3,7,8);

array_multisort($arr1,$arr2,$arr3);

查看结果,1自始至终都对应6对应3,其它项也是如此。这种对应关系就是手册中所谓的“排序时保留原有的键名关联”。

另外也可以把每个数组想像成数据库表的一列。而对应着的1,6,3为一数据行,9,2,7为另一数据行。。。

array_multisort会先按第一个数组(想像成列)排序,如果第一个数组(列)的值相同,则按第二个数组(列)排序。

具体可以用下面的程式来测试:

$arr1 = array(1,9,5,9);

$arr2 = array(6,2,4,1);

$arr3 = array(3,7,8,0);

array_multisort($arr1,$arr2,$arr3);

可以想像这里$arr3的结果是(3,8,0,7)。

二、接下来讲解array_multisort的参数。这个函数的参数很灵活。最简单的情况是如上面所示的以1个或n个数组作为参数,需要注意的是每个数组的项数要一样,否则会warning导致排序失效。

像这样array_multisort($arr1,$arr2,$arr3); 默认是所有数组都是升序排列,如果想对$arr2降序,并当作字符串去比较,就要写成:

array_multisort($arr1, $arr2, SORT_DESC, SORT_STRING, $arr3);

每个array后面可以跟一个排序顺序标志或一个排序类型标志,或者两种标志同时出现。但是每种排序标志在每个数组后面只能出现一个。

详细如下:

排序顺序标志:

SORT_ASC - 按照上升顺序排序(默认)

SORT_DESC - 按照下降顺序排序

排序类型标志:

SORT_REGULAR - 将项目按照通常方法比较(默认)

SORT_NUMERIC - 将项目按照数值比较

SORT_STRING - 将项目按照字符串比较

三、最后是array_multisort有什么实际作用。

我们通常有一些多维数组需要排序:

$guys = Array

(

[0] = Array

(

[name] = jake

[score] = 80

[grade] = A

)

[1] = Array

(

[name] = jin

[score] = 70

[grade] = A

)

[2] = Array

(

[name] = john

[score] = 80

[grade] = A

)

[3] = Array

(

[name] = ben

[score] = 20

[grade] = B

)

)

例如我们想按成绩倒序排列,如果成绩相同就按名字的升序排列。

这时我们就需要根据$guys的顺序多弄两个数组出来:

$scores = array(80,70,80,20);

$names = array('jake','jin','john','ben');

然后

array_multisort($scores, SORT_DESC, $names, $guys);就行了

还能不能更灵活一点呢,每次想排序都要另外弄些数组出来吗?

其实在qeephp的helper_array类里面已经封装得很好,下面是它的两个方法,需要的人自己修改一下就可以用了:

/**

* 根据指定的键对数组排序

*

* 用法:

* @code php

* $rows = array(

* array('id' = 1, 'value' = '1-1', 'parent' = 1),

* array('id' = 2, 'value' = '2-1', 'parent' = 1),

* array('id' = 3, 'value' = '3-1', 'parent' = 1),

* array('id' = 4, 'value' = '4-1', 'parent' = 2),

* array('id' = 5, 'value' = '5-1', 'parent' = 2),

* array('id' = 6, 'value' = '6-1', 'parent' = 3),

* );

*

* $rows = Helper_Array::sortByCol($rows, 'id', SORT_DESC);

* dump($rows);

* // 输出结果为:

* // array(

* // array('id' = 6, 'value' = '6-1', 'parent' = 3),

* // array('id' = 5, 'value' = '5-1', 'parent' = 2),

* // array('id' = 4, 'value' = '4-1', 'parent' = 2),

* // array('id' = 3, 'value' = '3-1', 'parent' = 1),

* // array('id' = 2, 'value' = '2-1', 'parent' = 1),

* // array('id' = 1, 'value' = '1-1', 'parent' = 1),

* // )

* @endcode

*

* @param array $array 要排序的数组

* @param string $keyname 排序的键

* @param int $dir 排序方向

*

* @return array 排序后的数组

*/

static function sortByCol($array, $keyname, $dir = SORT_ASC)

{

return self::sortByMultiCols($array, array($keyname = $dir));

}

/**

* 将一个二维数组按照多个列进行排序,类似 SQL 语句中的 ORDER BY

*

* 用法:

* @code php

* $rows = Helper_Array::sortByMultiCols($rows, array(

* 'parent' = SORT_ASC,

* 'name' = SORT_DESC,

* ));

* @endcode

*

* @param array $rowset 要排序的数组

* @param array $args 排序的键

*

* @return array 排序后的数组

*/

static function sortByMultiCols($rowset, $args)

{

$sortArray = array();

$sortRule = '';

foreach ($args as $sortField = $sortDir)

{

foreach ($rowset as $offset = $row)

{

$sortArray[$sortField][$offset] = $row[$sortField];

}

$sortRule .= '$sortArray[\'' . $sortField . '\'], ' . $sortDir . ', ';

}

if (empty($sortArray) || empty($sortRule)) { return $rowset; }

eval('array_multisort(' . $sortRule . '$rowset);');

return $rowset;

}

php 如何做排列组合

原理相当于自己建个树,不停地在末尾里添加上子节点,最后遍历整个树。

代码如下:

?php

$str='1=12,2=34,3=14,4=23';

$_str=explode(',',$str);

$_str=array_reverse($_str);

$_key=array();

$tree=array();

foreach($_str as $v){

$str=explode('=',$v);

$_key[]=$str[0];

$str=str_split($str[1]);

$_tree=array();

foreach($str as $node){

if(empty($tree)):

$_tree[][]=$node;

else:

foreach($tree as $_node) $_tree[]=str_split(implode($_node).$node);

endif;

}

$tree=$_tree;

}

foreach($tree as $v){

$str=array();

foreach($v as $_k=$_v) $str[]=$_key[$_k].'='.$_v;

echo implode(',',array_reverse($str)),'br';

}

?

PHP实现的自定义数组排序函数与排序类示例

本文实例讲述了PHP实现的自定义数组排序函数与排序类。分享给大家供大家参考,具体如下:

/*

*

二维数组自定义排序函数

*

uasort($arr,function_name)

*

**/

$arr

=

array(

array('a'=1,'b'='c'),

array('a'=4,'b'='a'),

array('a'=5,'b'='g'),

array('a'=7,'b'='f'),

array('a'=6,'b'='e')

);

function

compare_arr($x,$y){

if($x['b']$y['b']){

return

-1;

}else

if($x['b']$y['b']){

return

1;

}else{

return

0;

}

}

uasort($arr,'compare_arr');

foreach($arr

as

$a){

echo

$a['a'].'='.$a['b'].'br/';

}

手册里的自定义排序类:

class

multiSort

{

var

$key;

//key

in

your

array

//排序函数

参数依次是

数组

待排列索引

排序类型

function

run

($myarray,

$key_to_sort,

$type_of_sort

=

'')

{

$this-key

=

$key_to_sort;

if

($type_of_sort

==

'desc')

uasort($myarray,

array($this,

'myreverse_compare'));

else

uasort($myarray,

array($this,

'mycompare'));

return

$myarray;

}

//正序

function

mycompare($x,

$y)

{

if

(

$x[$this-key]

==

$y[$this-key]

)

return

0;

else

if

(

$x[$this-key]

$y[$this-key]

)

return

-1;

else

return

1;

}

//逆序

function

myreverse_compare($x,

$y)

{

if

(

$x[$this-key]

==

$y[$this-key]

)

return

0;

else

if

(

$x[$this-key]

$y[$this-key]

)

return

-1;

else

return

1;

}

}

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数组(Array)操作技巧大全》、《php排序算法总结》、《php字符串(string)用法总结》、《PHP针对XML文件操作技巧总结》、《PHP错误与异常处理方法总结》、《PHP运算与运算符用法总结》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

PHP 多个数组的排列组合

$a = array(1,2,3,4,5,6,7);

$b = array(1,2,3);

$c = array(1,2,3,4,5,6,7,8,9,10);

$d = array($a,$b,$c);

//计算每一个数组的长度

$len = 1;

$arrLen = count($d); //需要排列数组有多少个

$recIndex = null; //记录当前该取的位置

//foreach 计数

$count_3 = 0;

foreach ($d as $key = $value) {

$lenRec[$count_3] = count($value);

$len = $lenRec[$count_3]*$len;

$recIndex[] = 0;//第一次全部取第0个

$count_3++;

}

//算出% 的值

$count = 1;

foreach ($lenRec as $key = $value) {

$moduloVal = 1;

if($arrLen == $count){

$modulo[] = count($d[$arrLen-1]); //等于最后一个的长度

}else{

$count_1 = 1;

foreach ($lenRec as $index = $item) {

$count_1 $count $moduloVal = $moduloVal*$item;

$count_1 ++;

}

$modulo[] = $moduloVal;

}

$count ++;//为了防止$d key是有值的 不是自然序列 需要计数

}

$i = 1;

while ( $i = $len) {

$html = '';

$count_2 = 0;// 取模

$temp = '';

foreach ($d as $value) {

$html .= $value[$recIndex[$count_2]%$lenRec[$count_2]].",";

$count_2 ++;

}

echo $html."br";

foreach ($modulo as $key = $value) {

if($i%$value == 0 $key $arrLen - 1 ){

$recIndex[$key] = $recIndex[$key] +1;

}

if($key == $arrLen - 1){

if($i%$value == 0){

$recIndex[$key] = 0;

}else{

$recIndex[$key] = $recIndex[$key] +1;

}

}

}

$i ++;

//改变获取的位置

}