## 数组,排序和查找
### 定义数组:
#### 方式一:
` $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)