## 數組,排序和查找
### 定義數組:
#### 方式一:
` $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>";
}
~~~
### 插入排序法

### 快速排序法
