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







?>
相關文章
相關標籤/搜索