php數組基礎
php中,數組的下標可以是整數,或字符串。
php中,數組的元素順序不是由下標決定,而是由其“加入”的順序決定。
定義:
$arr1 = array(元素1,元素2,。。。。。 );
array(1, 5, 1.1, “abc”, true, false); //可以存儲任何數據,此時為“默認下標”,
array(2=>1, 5=>5, 3=>1.1, 7=>“abc”, 0=>true);//下標可以任意設定(無需順序,無需連續)
array(2=>1, 5, 1=>1.1, “abc”, 0=>true)//可以加下標,也可以不加(默認下標)
//默認下標規則:前面已經用過的最大數字下標+1
array(2=>1, ‘dd’=>5, 1=>1.1, “abc”, 0=>true)//混合下標,同樣遵循默認下標規則
array(-2=>1, ‘dd’=>5, 1.1, “abc”, true); //負數下標不算在整數下標中,而只當作字符下標
//則最好3項的下標是:0, 1, 2
array(2.7=>1, ‘dd’=>5, 1=>1.1, “abc”, 0=>true);//浮點數下標為自動轉換為整數,且直接抹掉小數
array(“2.7” =>1, ‘dd’=>5, “11”=>1.1, “abc”, true)//純數字字符串下標,當作數字看待,
//則此時下標為:2, ‘dd’, 11, 12, 13
array(2=>1, ‘dd’=>5, true=>1.1, “abc”, false=>true)//布爾值當下標,則true為1,false為0;
array(2=>1, ‘dd’=>5, 2=>1.1, “abc”, true)//如果下標跟前面的重復,則單純覆蓋前面同名下標的值
//此時相當於為:array(2=>1.1, ‘dd’=>5, “abc”, true)
其他形式;
$arr1[] = 1;
$arr1[] = 5;
$arr1[] = 1.1; //直接在變量後面使用
。。。。
$arr2[‘aa’] = 1;
$arr2[‘bbbcc’] = 5;
$arrr2[5] = 1.1;
。。。。。。。。
這種形式寫的下標,其實跟使用array語法結構幾乎一樣。
取值:通過下標。
賦值(同定義):
數組的分類
從鍵值關系:
關聯數組:
通常是指下標為字符串,並且該字符串大體可以表達出數據的含義的數組。
例:
$person = array( “name” => “小花”, “age”=>18, “edu” => “大學畢業” , );
索引數組:
通常是指一個數組的下標是嚴格的從0開始的連續的數字下標——跟js數組一樣。
從數組層次來分:
一維數組:
就是一個數組中的每一個元素值,都是一個普通值(非數組值)
$arr1 = array( “name” => “小花”, “age”=>18, “edu” => “大學畢業” )
二維數組:
一個數組中的每一項,又是一個一維數組。
$arr1 = array( “name” => array(‘小花’, ‘小芳’, ‘小明’, ), “age”=> array(18, 22, 19), “edu” => array(“大學畢業”, ‘中學’, ‘小學’) );
多維數組:
依此類推。。。
多維數組的一般語法形式:
$v1 = 數組名[下標][下標][.....]
數組遍歷
遍歷基本語法
foreach( $arr as [ $key => ] $value ) //$key可以稱為鍵變量,$value可以稱為值變量。
{
//這裏就可以對$key 和 $value 進行所有可能的操作——因為他們就是一個變量
//$key 代表每次取得元素的下標,可能是數字,也可以能是字符串
//$value 代表每次取得元素的值,可能是各種類型。
//此循環結構會從數組的第一項一直遍歷循環到最後一項,然後結束。
}
交換原理:
foreach 遍歷細節探討
foreach也是正常的循環語法結構,可以有break和continue等操作。
遍歷過程中值變量默認的傳值方式是值傳遞。
遍歷過程中值變量可以人為設定為引用傳遞:
foreach($arr as $key => &$value){ ... }
鍵變量不可以設定為引用傳遞
foreach默認是原數組上進行遍歷。但如果在遍歷過程中對數組進行了某種修改或某種指針性操作(就是指前面的指針函數),則會復制數組後在復制的數組上繼續遍歷循環。
foreach中如果值變量是引用傳遞,則無論如何都是在原數組上進行。
數組排序思想介紹
冒泡排序
目標:將下列數組進行正序(從小到大)排列出來
$arr2 = array(5, 15 , 3, 4, 9, 11);
一般性邏輯描述:
1,對該數組從第一個元素開始,從左到右,相鄰的2個元素比較大小:如果左邊的比右邊的大,則將他們倆交換位置,結果:
array( 5, 15, 3, 4, 9, 11);(原始)
array( 5, 15, 3, 4, 9, 11);
array( 5, 3, 15, 4, 9, 11);
array( 5, 3, 4, 15, 9, 11);
array( 5, 3, 4, 9, 15, 11);
array( 5, 3, 4, 9, 11, 15);
此時,才“走完一輪回”,繼續下一輪:
array( 5, 3, 4, 9, 11, 15);(初始)
array( 3 5, 4, 9, 11, 15);
array( 3 4, 5 9, 11, 15);
array( 3 4, 5 9, 11, 15);
array( 3 4, 5 9, 11, 15);
繼續下一輪:
array( 3 4, 5 9, 11, 15);
。。。。。。。。
最初: |
5 |
15 |
3 |
4 |
9 |
11 |
第1趟之後: |
5 |
3 |
4 |
9 |
11 |
15 |
第2趟之後 |
3 |
4 |
5 |
9 |
11 |
15 |
第3趟之後 |
3 |
4 |
5 |
9 |
11 |
15 |
第4趟之後 |
3 |
4 |
5 |
9 |
11 |
15 |
第5趟之後 |
3 |
4 |
5 |
9 |
11 |
15 |
隱含的邏輯描述(假設數組有n項):
1, 需要進行n-1趟的“冒泡”比較過程。
2, 每一趟的比較都前一趟少比一次,第一趟需要比較n-1次
3, 每趟比較,都是從數組的開頭(0)開始,跟緊挨的元素比較,並進行交換(需要的時候)
選擇排序
目標:將下列數組進行正序(從小到大)排列出來
$arr2 = array( 5, 15, 3, 4, 9, 11);
一般性邏輯描述:
第1趟:取得該數組中的最大值及其下標,然後跟該數組的最後一項“交換”(倒數第1項確定)
第2趟:取得該數組中除最後1項中的最大值及其下標,然後跟倒數第2項交換(倒數第2項確定)
第3趟:取得該數組中除最後2項中的最大值及其下標,然後跟倒數第3項交換(倒數第3項確定)
。。。。。。
最初: |
5 |
15 |
3 |
4 |
9 |
11 |
第1趟之後: |
5 |
11 |
3 |
4 |
9 |
15 |
第2趟之後 |
5 |
9 |
3 |
4 |
11 |
15 |
第3趟之後 |
5 |
4 |
3 |
9 |
11 |
15 |
第4趟之後 |
3 |
4 |
5 |
9 |
11 |
15 |
第5趟之後 |
3 |
4 |
5 |
9 |
11 |
15 |
隱含的邏輯描述(假設數組有n項):
1,要進行n-1趟才可能得出結論
2,每一趟要找的數據的個數都比前一趟少一個,第1趟要找n個
3,每次找出的最大值所在的項,和要與之進行交換的項的位置,依次減1,第一次的位置n-1
數組查找:
就是從一個數組中找一個元素的數據(可能是找下標,也可以是找數據值)
數組的查找通常有2種需求:
1:判斷要找的數據是否存在。
2:找出要找的數據的位置(下標)
順序查找
從一個數組中按順序找出一個元素(下標或值)
需求1:判斷要找的數據是否存在
$v1 = 10; function search1( $arr, $v1){ foreach($arr as $value ){ if( $c1 == $value ){ return true; } } return false; }
需求1:找出要找的數據的位置(下標)
$v1 = 10; function search2( $arr, $v1){ foreach($arr as $key => $value ){ if( $c1 == $value ){ return $key; //找到,返回位置(下標) } } return false; }
//特別註意以下寫法:
if ( ($m = search2( $arr, 10)) === false){ echo “沒找到。” } else{ echo “找到了,位置為:$m” }
二分查找
二分查找的前提:
1,針對一個已經進行了排序的數組(即裏面的數據已經是有序了)
2,是連續的索引數組,比如下標為:0, 1, 2, 3, ......
比如:
$arr2 = array( 3, 4, 5, 15, 19, 21, 25, 28, 30, 30, 33, 38, 44, 51, 52, 55, 60, 77, 80, 82, 83);
php數組基礎