🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 数组,排序和查找 ### 定义数组: #### 方式一: ` $a=array(2,3,5);` #### 方式二: ~~~ $a[0]=2; $a[1]=3; $a[2]=5; ~~~ #### 方式三: `$a=array('key1'=>2,'key2'=3,'key3'=5);` ### 细节说明: * 键key可以是一个整数或字符串,不是这种类型会被强制转换 * 值可以是任意类型 * 如果键名重复,会被覆盖 * 键名:true自动转为1,false自动转为0,null等同于空字符串,小数会自动截断小数部分 * 不能用数组和对象作为Key ~~~ $a=array(8.3=>111,true=>2222,false=>3333,null=>4444); print_r($a); ~~~ ~~~ $arr=array(); for($i=0;$i<100;$i++){ $arr[]=rand(100,200); } ~~~ 例子: ~~~ $a=array(3,4,6,1); $b=0; for($i=0;$i<count($a);$i++){ $b+=$a[i]; } echo $b; ~~~ ### 数组使用:增删改查 * 索引数组:$a[2]; * 关联数组:$a['logo']; * 不存在的数组键值提示notice错误 * key如果不指定或为空,会自动增长 ### 数组遍历 ~~~ for ($i=0; $i < ; $i++) { # code... } foreach ($variable as $key => $value) { # code... } ~~~ 使用foreach替代模板中的导航: ~~~ <?php foreach($arr as $val): ?> <li><a href="#"><?php echo $val; ?></a></li> <?php endforeach;?> ~~~ ### 数组常用函数: 1. count($arr); 数组统计 3. is_array(); 判断是否是数组 5. print_r(); 显示数组 7. var_dump(); 显示数组,并给出每个值的类型 9. sort(); 对字符串数组排序,从第一个字符开始,按字符串的ascii码排序,第一个相同,比较第二个;如果是数字,从小到大排序 11. usort();用户自定义函数对数组排序,改变原数组 sort_regular sort_numeric sort_string ~~~ $arr=array('dssssd','ddd3s','aaaaaa','z','44'); function mysort($str1,$str2){ if(strlen($str1)==strlen($str2)){ return 0; }else{ return strlen($str1)>strlen($str2)?1:-1; } } usort($arr,'mysort'); ~~~ 1. arrar_merge(); 合并多个数组,按顺序拼接,相同关联键名会被覆盖; 如果是数字键名,不会覆盖,会自动增加 ~~~ $arr=array('dssssd','ddd3s','aaaaaa','z','44'); $arr2=array(2,54,6); $arr3=array_merge($arr,$arr2); ~~~ 1. array_reverse(); 颠倒数组顺序,不改变原数组 1. array_search(); 找到返回该键名key,找不到返回false echo array_search('d',$arr); 1. array_push; 插入一个值,返回新的数组长度 1. array_pop;将数组最后一个值去掉,返回删掉的值 ~~~ $arr=array('dssssd','ddd3s','aaaaaa','z','44'); echo array_pop($arr); echo array_push($arr,'11111','22222'); echo "<pre>"; print_r($arr); ~~~ 1. range(); 创建一个数组,从某范围的值,步长默认为1 range(0,100,5); //0-100之间的数组,步长为5 ### 数组的删除: * 删除某个键值对,数组不会重建索引,那个索引位置留空 unset($arr[1]); * 删除整个数组: unset($arr); * 数组分配机制: 检测空间使用了多大内存:memory_get_usage(); 把数组赋值给另一个数组,新的数据空间,并没有马上分配,除非你修改了新的数组的某个值。 ### 数组运算符: ~~~ + 联合,重复键值的忽略,不会覆盖,没有的就会拼接上。 == 相同的键,值。不会对值的类型进行比较 === !== <> 不等 != 不等 ~~~ ## 数组方法: * 内部排序(在内存中排序) 交换式,选择式,插入式 * 外部排序(数据量过大,无法在内存中排序,借助外部存储) 合并排序,直接合并排序 1. 交换式排序: * 冒泡法 * 快速法 ~~~ function mysort(&$arr){ for ($i=0; $i <count($arr)-1; $i++) { for($j=0;$j<count($arr)-1-$i;$j++){ if($arr[$j]>$arr[$j+1]){ $temp=$arr[$j]; $arr[$j]=$arr[$j+1]; $arr[$j+1]=$temp; } } } } ~~~ ### 冒泡排序的优化: ~~~ if($flag==0){ break; }else{ $flag=0; } ~~~ ### 选择排序法 ~~~ for ($i=0; $i <count($arr)-1 ; $i++) { $max=$arr[$i]; $max_index=$i; for ($j=$i+1; $j <count($arr) ; $j++) { if ($max<$arr[$j]) { $max=$arr[$j]; $max_index=$j; } } $arr[$max_index]=$arr[$i]; $arr[$i]=$max; } ~~~ ### 插入排序 ### 快速排序 ### 顺序查找 ~~~ function search(&$arr,$val){ $flag=0; for ($i=0; $i <count($arr) ; $i++) { if($arr[$i]==$val){ $flag=1; echo '找到了,下标为:'.$i; } } if($flag==0){ echo "找不到数据"; } } ~~~ ### 二分法查找 ~~~ function search($left_index,$right_index,$arr,$val){ if($left_index>$right_index){ echo "找不到数据"; return; } $mid_index=round(($left_index+$right_index)/2); if($val==$arr[$mid_index]){ echo "找到数据".$mid_index; return; }else if($val<$arr[$mid_index]){ search($left_index,$mid_index-1,$arr,$val); }else if($val>$arr[$mid_index]){ search($mid_index+1,$right_index,$arr,$val); } } $arr=array(1,3,5,7,8,10,12); search(0,count($arr)-1,$arr,7); ~~~ ### 二维数组的遍历 ~~~ $arr=array(array(2,5,6),array(6,3),'ddd'); $arrsize1=count($arr); for ($i=0; $i <$arrsize1 ; $i++) { if(is_array($arr[$i])){ for ($j=0; $j <count($arr[$i]) ; $j++) { echo $arr[$i][$j]; } echo "<br>"; }else{ echo $arr[$i]; } } echo "<hr>"; foreach ($arr as $key => $value) { if(is_array($arr[$i])){ foreach ($value as $key2 => $value2) { echo $value2; } } echo "<br>"; } ~~~ ### 插入排序法 ![](https://box.kancloud.cn/cb0f5374398a87884f25627dc3c278d6_431x254.png) ### 快速排序法 ![](https://box.kancloud.cn/fa520ee1ad36467c9f034d2921c563bf_373x112.png)