php数组排序笔记

<?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);







?>

转载于:https://my.oschina.net/u/932154/blog/99747

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值