php数组排序与数组查找综合实例

发布时间:2020-07-11编辑:脚本学堂
有关php数组排序与php数组查找的一些例子,包括了数组特殊下标的用法、删除数组中键值对的方法、数组合并、以及数组中元素的多种查找方法等。

一、php数组操作细节
1、数组在没指定下标时自动递增,后一个下标在前一个下标的基础上加1
 

复制代码 代码示例:
<?php
$arr = array(5=>999,6,99);
$res = $arr[6];
echo $res;//结果为6
?>

2、几个特殊的数组下标,true<====>1、false<====>0,null<====>’ ’
 

复制代码 代码示例:
<?php
$arr[true] = 0;
$arr[false] = 'hello';
$arr[null]='中国';
echo '<br/>'.$arr[1];  //结果为0
echo '<br/>'.$arr[0];  //结果为hello
echo '<br/>'.$arr[null];   //结果为中国
echo '<br/>'.$arr[''];//结果为中国
$arr[123.4] = 'float';
echo '<br/>'.$arr[123.4];//结果为float
echo '<br/>'.$arr[123];  //结果为float
?>

3、删除数组中的某个键-值对,不会重建索引
 

复制代码 代码示例:
$myarr = array(9,222,1000);
unset($myarr[1]);
var_dump($myarr);
?>
 

结果:array (size=2)
  0 => int 9
  2 => int 1000

4、数组中存在数字下标和字符串下标
 

复制代码 代码示例:
<?php
//获取数组元素
$array = array('moushu','lys','name'=>'luoyunshu','ms','lycia2011');
echo $array[1];   //lys
echo $array[2];   //ms
echo $array[3];   //lycia
echo $array['name'];   //luoyunshu
 
?>

5、array_merge()和+操作符
 

复制代码 代码示例:
?php
$a = array('a'=>'apple','b'=>'banana');
$b = array('a'=>'pear','b'=>'strawberry','c'=>'cherry');
$arr = array_merge($a, $b);
//键值相同的会被覆盖
var_dump($arr);
//array(3) { ["a"]=> string(4) "pear" ["b"]=> string(10) "strawberry" ["c"]=> string(6) "cherry" }
 
//键值相同的不会被覆盖
var_dump($a+$b);
//array(3) { ["a"]=> string(5) "apple" ["b"]=> string(6) "banana" ["c"]=> string(6) "cherry" }
 
$a = array(1, 2, 3);
$b = array(4, 5, 6);
var_dump($a+$b);
var_dump(array_merge($a,$b));
//array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
//array(6) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) }
?>
 

 
二、php数组查找
1、顺序查找
 

复制代码 代码示例:
function search(&$arr,$findVal)
{
$flag = false;
foreach($arr as $k=>$v) {
if($findVal == $v) {
echo "找到了,下标为=".$k;
$flag = true;
}
}
if(!$flag) {
echo '查不到';
}
}

2、折半查找
 

复制代码 代码示例:
header('content-type:text/html;charset=utf-8');
//$arr要求数组按照从小到大排列的有序数组
function binary_search(&$arr, $findVal, $leftIndex, $rightIndex) {
if($leftIndex > $rightIndex) {
echo '找不到!';
return;
}
if($findVal<$arr[$leftIndex] || $findVal>$arr[$rightIndex]) {
echo '找不到';
return;
}
$middleIndex = round(($leftIndex+$rightIndex)/2);
if($findVal == $arr[$middleIndex]) {
echo '找到了!索引为:'.$middleIndex;
return;
}elseif($findVal < $arr[$middleIndex]) {
binary_search($arr,$findVal,$leftIndex,$middleIndex-1);
}else {
binary_search($arr,$findVal,$middleIndex+1,$rightIndex);
}
}
function bubble_sort(&$arr,$type='DESC') {
$count = count($arr)-1;
$temp = 0;
for($i=0; $i<$count; $i++) {
$flag = false;
for($j=0; $j<$count-$i; $j++) {
if($type == 'DESC') {
if($arr[$j+1] > $arr[$j]) {
$temp = $arr[$j+1];
$arr[$j+1] = $arr[$j];
$arr[$j] = $temp;
$flag = true;
}
}else {
if($arr[$j+1] < $arr[$j]) {
$temp = $arr[$j+1];
$arr[$j+1] = $arr[$j];
$arr[$j] = $temp;
$flag = true;
}
}
}
if($flag == false) {
break;
}
 }
}
$arr = array(1,3,99,100,5,6,1111,2,0);
bubble_sort($arr,'ASC');
//print_r($arr);
//echo '<br/>';
binary_search($arr,100,0,count($arr)-1);
print_r($arr);

3、插补查找
 

复制代码 代码示例:
function interopation_search(array $list,$len,$search){
$low = 0;
$high = $len - 1;
if($search < $list[$low] || $search > $list[$high]){
return 0;
}
while($low <= $high) {
$middle = floor($low + ($search - $list[$low])*($high - $low) / ($list[$high] - $list[$low]));
if($middle < $low){
$middle = $low;
}
else if($middle > $high) {
$middle = $high;
}
if($search == $list[$middle]) {
return 1;
}
else if($search > $list[$middle]) {
$low = $middle + 1;
}
else if($search < $list[$middle]) {
$high = $middle -1;
}
}
return 0 ;
}

三、php数组排序
1、冒泡排序
见上面的bubble_sort()

2、选择排序
 

复制代码 代码示例:
function select_sort(&$arr)
{
//中间变量
$temp = 0;
$count = count($arr)-1;
$count2 = count($arr);
for($i=0;$i<$count;$i++) {
$minVal = $arr[$i];
$minIndex = $i;
for($j=$i+1;$j<$count2;$j++) {
if($minVal>$arr[$j]) {
$minVal = $arr[$j];
$minIndex = $j;
}
}
$temp = $arr[$i];
$arr[$i] = $arr[$minIndex];
$arr[$minIndex] = $temp;
}
}

3、插入排序
 

复制代码 代码示例:
function insert_sort(&$arr)
{
$count = count($arr);
for($i=1;$i<$count;$i++) {
//准备插入的数
$insertVal = $arr[$i];
$insertIndex = $i-1;
while($insertIndex>=0 && $insertVal<$arr[$insertIndex]) {
$arr[$insertIndex+1] = $arr[$insertIndex];
$insertIndex--;
}
$arr[$insertIndex+1] = $insertVal;
}
}

4、快速排序
 

复制代码 代码示例:
function quick_sort($left,$right,&$arr)
{  
$l = $left;
$r = $right;
$pivot = $arr[($left+$right)/2];
$temp = 0;
while($l < $r) {
if($arr[$l] < $pivot) $l++;
if($arr[$r] > $pivot) $r--;
if($l >= $r) break;
$temp = $arr[$l];
$arr[$l] = $arr[$r];
$arr[$r] = $temp;
if($arr[$l] == $pivot) --$r;
if($arr[$r] == $pivot) ++$l;
}
if($l == $r) {
$l++;
$r--;
}
if($left<$r) quick_sort($left,$r,$arr);
if($right>$r) quick_sort($l,$right,$arr);
}
//测试效率
function microtime_float()
{
list($usec,$sec) = explode(' ',microtime());
return ((float)$usec + (float)$sec);
}
function dump($arr)
{
echo '<pre>';
print_r($arr);
echo '</pre>';
}
//$arr = array(0,11,22,99,100,110,120);
for($i=0;$i<20;$i++) {
$arr[$i] = rand(0,3000);
}
$stime1 = microtime_float();
bubble_sort($arr);
dump($arr);
$etime1 = microtime_float();

效率比较:
冒泡法 < 选择排序法 < 插入排序法

四、二维数组排序
 

复制代码 代码示例:
<?php
$arr = array(
array('num'=>9,'value'=>'abc'),
array('num'=>10,'value'=>'defg')
);
//第一种方法:使用usort、uasort函数比较
//uasort:保持键值关联排序
//usort:不保持
uasort($arr, function($row1, $row2){
return $row1['num'] - $row2['num'];
});
var_dump($arr);
//array(2) { [0]=> array(2) { ["num"]=> int(9) ["value"]=> string(3) "abc" }
//[1]=> array(2) { ["num"]=> int(10) ["value"]=> string(4) "defg" } }
//第二种方法:使用array_multisort函数比较
function ArrSort($Arr,$Field,$Sort='DESC')
{
foreach ($Arr as $key => $row) {
${$Field}[$key] = $row[$Field];
}
if (strtoupper($Sort)=='DESC') {
array_multisort(${$Field},SORT_DESC,$Arr);
}else {
array_multisort(${$Field},SORT_ASC,$Arr);
}
return $Arr;
}
echo '<pre>'.print_r(ArrSort($arr,'num','desc'),1).'</pre>';
//第三种方法:自定义函数比较
function array_sort($arr, $field, $type) {
$tempArr = array();
foreach($arr as $k=>$v) {
$tempArr[$k] = $v[$field];
}
if(strtoupper($type) == 'ASC') {
asort($tempArr);   //对数组进行排序并保持索引关系
}else {
arsort($tempArr);//arsort — 对数组进行逆向排序并保持索引关系
}
$res = array();
foreach($tempArr as $k=>$v) {
$res[$k] = $arr[$k];
}
return $res;
}
echo '<pre>'.print_r(array_sort($arr,'num','ASC'),1).'</pre>';
?>