php数据排序的方法 php数组排序方法

php怎么把数组里的数字排序可以使用自定义函数排序uasort(),搭配匿名函数挺方便php数据排序的方法的
$array = array('a' = 4, 'b' = 8, 'c' = -1, 'd' = -9, 'e' = 2, 'f' = 5, 'g' = 3, 'h' = -4);
uasort($array,function($a,$b){
if ($a == $b) {
return 0;
}
return ($a$b) ? -1 : 1;
});
print_r($array);
PHP实现常见的排序算法注:为方便描述php数据排序的方法,下面的排序全为正序(从小到大排序)
假设有一个数组[a,b,c,d]
冒泡排序依次比较相邻的两个元素,如果前面的元素大于后面的元素,则两元素交换位置;否则,位置不变 。具体步骤:
1 , 比较a,b这两个元素,如果ab,则交换位置,数组变为:[b,a,c,d]
2,比较a,c这两个元素,如果ac,则位置不变,数组变为:[b,a,c,d]
3,比较c,d这两个元素,如果cd,则交换位置,数组变为:[b,a,d,c]
完成第一轮比较后,可以发现最大的数c已经排(冒)在最后面php数据排序的方法了,接着再进行第二轮比较,但第二轮比较不必比较最后一个元素了,因为最后一个元素已经是最大的了 。
第二轮比较结束后,第二大的数也会冒到倒数第二的位置 。
依次类推,再进行第三轮,,,
就这样最大的数一直往后排(冒),最后完成排序 。所以我们称这种排序算法为冒泡排序 。
选择排序是一种直观的算法,每一轮会选出列中最小的值,把最小值排到前面 。具体步骤如下:
插入排序步骤大致如下:
快速排序是由东尼·霍尔所发展的一种排序算法 。在平均状况下 , 排序 n 个项目要Ο(n log n)次比较 。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见 。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性 。
步骤:
从数列中挑出一个元素,称为 “基准”(pivot) ,
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边) 。在这个分区退出之后,该基准就处于数列的中间位置 。这个称为分区(partition)操作 。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序 。
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类里面已经封装得很好,下面是它的两个方法 , 需要的人自己修改一下就可以用了:
/**
* 根据指定的键对数组排序
【php数据排序的方法 php数组排序方法】*
* 用法:
* @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测试数组怎么排序?1、在test.php文件内,使用header设置test.php执行的编码为utf8,避免输出中文的时候出现乱码 。
2、在test.php文件内 , 创建一个测试的数组,例如,定义一个分类的数组,其对应的索引值分别为0,4,8 。
3、在test.php文件内,使用array_values()方法将上一步的数据重新排序,并且从0开始,把重新排序的数组保存在$result变量中 。
4、在test.php文件内,使用foreach方法遍历数组,其中$k为索引值,$v为索引值对应的数组值 。
5、在test.php文件内,使用echo方法输出数组中的索引值和对应的数组值即可 。
php几种排序算法实例详解四种排序算法的PHP实现:
1) 插入排序(Insertion Sort)的基本思想是:
每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止 。
2) 选择排序(Selection Sort)的基本思想是:
每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕 。
3) 冒泡排序的基本思想是:
两两比较待排序记录的关键字 , 发现两个记录的次序相反时即进行交换,直到没有反序的记录为止 。
4) 快速排序实质上和冒泡排序一样,都是属于交换排序的一种应用 。所以基本思想和上面的冒泡排序是一样的 。
1. sort.php文件如下:
?php
class Sort {
private $arr= array();
private $sort= 'insert';
private $marker = '_sort';
private $debug = TRUE;
/**
* 构造函数
*
* @paramarray例如:
$config = array (
'arr' = array(22,3,41,18) , //需要排序的数组值
'sort' = 'insert', //可能值: insert, select, bubble, quick
'debug' = TRUE //可能值: TRUE, FALSE
)
*/
public function construct($config = array()) {
if ( count($config)0) {
$this-_init($config);
}
}
/**
* 获取排序结果
*/
public function display() {
return $this-arr;
}
/**
* 初始化
*
* @paramarray
* @return bool
*/
private function _init($config = array()) {
//参数判断
if ( !is_array($config) OR count($config) == 0) {
if ($this-debug === TRUE) {
$this-_log("sort_init_param_invaild");
}
return FALSE;
}
//初始化成员变量
foreach ($config as $key = $val) {
if ( isset($this-$key)) {
$this-$key = $val;
}
}
//调用相应的成员方法完成排序
$method = $this-sort . $this-marker;
if ( ! method_exists($this, $method)) {
if ($this-debug === TRUE) {
$this-_log("sort_method_invaild");
}
return FALSE;
}
if ( FALSE === ($this-arr = $this-$method($this-arr)))
return FALSE;
return TRUE;
}
/**
* 插入排序
*
* @paramarray
* @return bool
*/
private function insert_sort($arr) {
//参数判断
if ( ! is_array($arr) OR count($arr) == 0) {
if ($this-debug === TRUE) {
$this-_log("sort_array(insert)_invaild");
}
return FALSE;
}
//具体实现
$count = count($arr);
for ($i = 1; $i$count; $i) {
$tmp = $arr[$i];
for($j = $i-1; $j = 0; $j--) {
if($arr[$j]$tmp) {
$arr[$j 1] = $arr[$j];
$arr[$j] = $tmp;
}
}
}
return $arr;
}
/**
* 选择排序
*
* @paramarray
* @return bool
*/
private function select_sort($arr) {
//参数判断
if ( ! is_array($arr) OR count($arr) == 0) {
if ($this-debug === TRUE) {
$this-_log("sort_array(select)_invaild");
}
return FALSE;
}
//具体实现
$count = count($arr);
for ($i = 0; $i$count-1; $i) {
$min = $i;
for ($j = $i 1; $j$count; $j) {
if ($arr[$min]$arr[$j]) $min = $j;
}
if ($min != $i) {
$tmp = $arr[$min];
$arr[$min] = $arr[$i];
$arr[$i] = $tmp;
}
}
return $arr;
}
/**
* 冒泡排序
*
* @paramarray
* @return bool
*/
private function bubble_sort($arr) {
//参数判断
if ( ! is_array($arr) OR count($arr) == 0) {
if ($this-debug === TRUE) {
$this-_log("sort_array(bubble)_invaild");
}
return FALSE;
}
//具体实现
$count = count($arr);
for ($i = 0; $i$count; $i) {
for ($j = $count-1; $j$i; $j--) {
if ($arr[$j]$arr[$j-1]) {
$tmp = $arr[$j];
$arr[$j] = $arr[$j-1];
$arr[$j-1] = $tmp;
}
}
}
return $arr;
}
/**
* 快速排序
* @by
* @paramarray
* @return bool
*/
private function quick_sort($arr) {
//具体实现
if (count($arr) = 1) return $arr;
$key = $arr[0];
$left_arr = array();
$right_arr = array();
for ($i = 1; $icount($arr); $i){
if ($arr[$i] = $key)
$left_arr[] = $arr[$i];
else
$right_arr[] = $arr[$i];
}
$left_arr = $this-quick_sort($left_arr);
$right_arr = $this-quick_sort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}
/**
* 日志记录
*/
private function _log($msg) {
$msg = 'date[' . date('Y-m-d H:i:s') . '] ' . $msg . '\n';
return @file_put_contents('sort_err.log', $msg, FILE_APPEND);
}
}
/*End of file sort.php*/
/*Location htdocs/sort.php */
2. sort_demo.php文件如下:
?php
require_once('sort.php');
$config = array (
'arr' = array(23, 22, 41, 18, 20, 12, 200303,2200,1192) ,
//需要排序的数组值
'sort' = 'select',
//可能值: insert, select, bubble, quick
'debug' = TRUE
//可能值: TRUE, FALSE
);
$sort = new Sort($config);
//var_dump($config['arr']);
var_dump($sort-display());
/*End of php*/
关于php数据排序的方法和php数组排序方法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读