您的位置:首页 > 编程语言 > PHP开发

php数组排序笔记

2013-01-03 00:00 225 查看
<?php
//简单的
//现在我们把冒泡法封装成函数,利用以后使用
function bubbleSort(&$myarr){
//这是一个中间变量
$temp=0;
//我们要把数组,从小到大
//外层循环
$flag=false;
for($i=0;$i<count($myarr)-1;$i++){

for($j=0;$j<count($myarr)-1-$i;$j++){

//说明前面的数比后面的数大,就要交换

if($myarr[$j]>$myarr[$j+1]){

$temp=$myarr[$j];
$myarr[$j]=$myarr[$j+1];
$myarr[$j+1]=$temp;
$flag=true;

}
}

//判断
if(!$flag){
//已经是有序
break;
}
$flag=false;
}

echo "<br/>函数中的myarr数组";
print_r($myarr);
}

//选择排序法

function selectSort(&$arr){

$temp=0;

for($i=0;$i<count($arr)-1;$i++){

//假设 $i就是最小的数
$minVal=$arr[$i];
//记录我认为的最小数的下标
$minIndex=$i;
for($j=$i+1;$j<count($arr);$j++){
//说明我们认为的最小值,不是最小
if($minVal>$arr[$j]){
$minVal=$arr[$j];
$minIndex=$j;
}
}
//最后交换

$temp=$arr[$i];
$arr[$i]=$arr[$minIndex];
$arr[$minIndex]=$temp;

}

}
//数组排序

//插入排序法(小->大)
function insertSort(&$arr){

//先默认下标为0 这个数已经是有序

for($i=1;$i<count($arr);$i++){
//$insertVal是准备插入的数
$insertVal=$arr[$i];
//准备先和$insertIndex比较
$insertIndex=$i-1;

//如果这个条件满足,说明,我们还没有找到适当的位置
while($insertIndex>=0&&$insertVal<$arr[$insertIndex]){

//同时把数后移
$arr[$insertIndex+1]=$arr[$insertIndex];

$insertIndex--;

}
//插入(这时就给$insertVal找到适当位置)

$arr[$insertIndex+1]=$insertVal;
}

}

//这个是快速排序.
function quickSort($left,$right,&$array){
$l=$left;
$r=$right;
$pivot = $array[($left+$right)/2];
$temp=0;

while($l<$r){

while($array[$l]<$pivot) $l++;
while($array[$r]>$pivot) $r--;

if($l>=$r) break;

$temp=$array[$l];
$array[$l]=$array[$r];
$array[$r]=$temp;

if($array[$l]==$pivot) --$r;
if($array[$r]==$pivot) ++$l;

}

if($l==$r){

$l++;
$r--;
}

if($left<$r)  quickSort($left,$r,$array);
if($right>$l) quickSort($l,$right,$array);

}

$arr=array(0,5,-1);

//使用函数去排序
//bubbleSort($arr);
//使用选择排序法
//selectSort($arr);
//插入排序法
insertSort($arr);

//输出
print_r($arr);

//二分查找函数
function binarySearch(&$arr,$findVal,$leftIndex,$rightIndex){
//当 $rightIndex>$leftIndex 说明没有数

if($rightIndex<$leftIndex){
echo "找不到该数";
return ;
}

//找到中间这个数
$middleIndex=round(($rightIndex+$leftIndex)/2);

//如果大于则,向后面找
if($findVal>$arr[$middleIndex]){

binarySearch($arr,$findVal,$middleIndex+1,$rightIndex);
}
//如果是小于中间这个数,则向前面找
else if($findVal<$arr[$middleIndex]){
binarySearch($arr,$findVal,$leftIndex,$middleIndex-1);
}else{
echo "找到这个数 下标是 $middleIndex";
}
}

//search($arr,-1);
$arr=array(-2,0,90,900,99990);
binarySearch($arr,-2,0,count($arr)-1);
echo '<br/>';

//用系统函数排序主要有 sort,asort,ksort

$data = array( "file1.txt", "file11.txt", "File2.txt", "FILE12.txt", "file.txt" );

natsort( $data );   	//普通的“自然排序”
print_r( $data );   	//输出排序后的结果,数组中包括大小写,输出不是正确的排序结果

natcasesort( $data );   //忽略大小写的“自然排序”
print_r( $data );    	//输出“自然排序”后的结果,正常结果

$data = array( "l"=>"Linux", "a"=>"Apache", "m"=>"MySQL", "p"=>"PHP" );

asort( $data );    	//使用asort()函数将数组$data按元素的值升序排序,并保留原有的键名和值
print_r( $data );   //输出:Array ( [a] => Apache [l] => Linux [m] => MySQL [p] => PHP )

arsort( $data );    //使用arsort()函数将数组$data按元素的值降序排序,并保留原有的键名和值
print_r( $data );  	//输出:Array ( [p] => PHP [m] => MySQL [l] => Linux [a] => Apache )

rsort( $data );   	//使用rsort()函数将数组$data按元素的值降序排序,但原始键名被忽略
print_r($data);  		//输出:Array ( [0] => PHP [1] => MySQL [2] => Linux [3] => Apache )

function sortByLen( $one, $two ) {
//如果两个参数长度相等返回0,在数组中的位置不变
if ( strlen( $one ) == strlen( $two ) )
return 0;
else
//第一个参数大于第二个参数返回大于0的数,否则返回小于0的数
return ( strlen( $one ) > strlen( $two ) ) ? 1 : -1;

}

//使用usort()函数传入用户自定义的回调函数进行数组排序
usort( $lamp, "sortByLen" );
print_r( $lamp );

//声明一个$data数组,模拟了一个行和列数组
$data = array(
array("id" => 1, "soft" => "Linux", "rating" => 3),
array("id" => 2, "soft" => "Apache", "rating" => 1),
array("id" => 3, "soft" => "MySQL", "rating" => 4),
array("id" => 4, "soft" => "PHP", "rating" => 2),
);

//使用foreach遍历创建两个数组$soft和$rating,作为array_multisort的参数
foreach( $data as $key => $value ) {
$soft[$key] = $value["soft"];     	  //将$data中的每个数组元素中键值为soft的值形成数组$soft
$rating[$key] = $value["rating"];  	  //将每个数组元素中键值为rating的值形成数组$rating
}

array_multisort( $rating, $soft, $data ); //使用array_multisort()函数传入三个数组进行排序
print_r( $data );

/* 排序顺序标志:

■SORT_ASC - 按照上升顺序排序
■SORT_DESC - 按照下降顺序排序

排序类型标志:

■SORT_REGULAR - 将项目按照通常方法比较
■SORT_NUMERIC - 将项目按照数值比较
■SORT_STRING - 将项目按照字符串比较 */

$grade = array("score" => array(70, 95, 70.0, 60, "70"),
"name" => array("Zhang San", "Li Si", "Wang Wu",
"Zhao Liu", "Liu Qi"));
array_multisort($grade["score"], SORT_NUMERIC, SORT_DESC,// 将分数作为数值,由高到低排序

$grade["name"], SORT_STRING, SORT_ASC);// 将名字作为字符串,由小到大排序

var_dump($grade);

?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php