標籤:關聯陣列 數字 索引 splay echo .com 分享 迴圈 依賴
一、數組的分類
1、關聯陣列:通常是指下標為字串,並且該字串大體可以表達出資料的含義的數組。
2、索引數組:通常是指一個數組的下標是嚴格的從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遍曆過程中,都是依賴與該指標而進行的!
舉例:$arr1 = array(2=>1, ‘dd’=>5, 1=>1.1, “abc”, 0=>true)
指標除了負責foreach迴圈的位置設定之外,還有其他一些函數也依賴於該指標:
1, $v1 = current( $arr1);//取得$arr1中當前指標所指向的元素的值,如果沒有指向元素,則為false
2, $v1 = key($arr1);//取得$arr1中當前指標所指向的元素的下標,。。。。。false
3, $v1 = next($arr1 );//將指標移向“下一個元素”,然後取得該下一個元素的值;
4, $v1 = prev($arr1);//將指標移向“上一個元素”,然後取得該上一個元素的值
5, $v1 = reset($arr1);//將指標移向“第一個元素”,然後取得該元素的值——數組指標初始化
6, $v1 = end($arr1);//將指標移向“最後一個元素”,然後取得該元素的值
7, $v1 = each($arr1);//取得當前元素的下標和值,然後移動指標到下一個位置。
for+next+reset遍曆數組
reset( $arr1 );//重設數組,即:數組指標初始化,這裡,返回的資料被“丟棄”了。
$len = count( $arr1);
for($i = 0; $i < $len $i++){
$key = key ($arr1 );//下標
$value = current( $arr1 );//值
//然後這裡就可以對$key 和 $value進行任何作為變數的操作
next($arr1);//這裡,移動指標到下一個元素(也同時丟棄了傳回值)
}
while+each()+list()遍曆數組
each()函數解釋:
each()函數可以取得一個數組中的一個元素的下標和值,然後再放入一個新的數組中,並且指標後移一位。
該新的數組,有4個元素,但儲存的是下標和值的“雙份”,類似下述形式:
array(
1 => 取出來的值,
‘value’ = >取出來的值,
0 = > 取出來的下標(鍵名),
‘key’ => 取出來的下標(鍵名)
);
list()函數解釋:
使用形式:
list($v1, $v2, $v3,$v4 .... )= 數組$arr1;
其作用是:依次取得數組$arr1中下標為0,1,2,3, ....的元素的值,並一次性放入多個變數中(一一對應)
即其相當於如下語句:
··$v1 = $arr1[0];
··$v2 = $arr1[1];
··$v3 = $arr1[2];
··$v4 = $arr1[3];
..........
但是注意:只能實現這樣的“從0開始的連續數字下標的元素的取值”(但並非要求數組的元素的順序為同樣的數字順序)
然後開始使用這2個函數和while迴圈結構來實現數組遍曆:
形式:
reset($arr1);
while ( list ($key, $value ) = each( $arr1) )//從數組$arr1中一次次取出元素,
//當each到數組最後的時候,就返回false,即此時迴圈結束
{
//這裡,就可以對$key ,和$value進行操作了。
}
foreach 遍曆細節探討
foreach也是正常的迴圈文法結構,可以有break和continue等操作。
遍曆過程中值變數預設的傳值方式是值傳遞。
遍曆過程中值變數可以人為設定為引用傳遞:
oforeach($arr as $key => &$value){ ... }
鍵變數不可以設定為引用傳遞
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);
隱含的邏輯描述(假設數組有n項):
1, 需要進行n-1趟的“冒泡”比較過程。
2, 每一趟的比較都前一趟少比一次,第一趟需要比較n-1次
3, 每趟比較,都是從數組的開頭(0)開始,跟緊挨的元素比較,並進行交換(需要的時候)
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>冒泡排序</title> 6 </head> 7 8 <body> 9 <?php10 $arr2 = array(5,15,3,4,9,11);11 $len = count($arr2); //count()函數用來統計數組元素個數,count()函數格式是count($array,mode),mode為選擇性參數12 // 需要進行n-1趟的冒泡比較13 echo "<br/>排序之前:";14 var_dump($arr2); //print_r通常用於列印變數的相關資訊,通常在調試中使用。15 for($i=0;$i<$len-1;$i++){16 for($k=0;$k<$len-1-$i;$k++){17 if($arr2[$k]>$arr2[$k+1]){18 $temp=$arr2[$k];19 $arr2[$k] = $arr2[$k+1]; 20 $arr2[$k+1]=$temp;21 }22 }23 }24 echo "<br/>排序之後:";25 var_dump($arr2);26 ?>27 </body>28 </html>
View Code
:
選擇排序
目標:將下列數組進行正序(從小到大)排列出來
$arr2 = array( 5, 15, 3, 4, 9, 11);
一般性邏輯描述:
第1趟:取得該數組中的最大值及其下標,然後跟該數組的最後一項“交換”(倒數第1項確定)
第2趟:取得該數組中除最後1項中的最大值及其下標,然後跟倒數第2項交換(倒數第2項確定)
第3趟:取得該數組中除最後2項中的最大值及其下標,然後跟倒數第3項交換(倒數第3項確定)
隱含的邏輯描述(假設數組有n項):
1,要進行n-1趟才可能得出結論
2,每一趟要找的資料的個數都比前一趟少一個,第1趟要找n個
3,每次找出的最大值所在的項,和要與之進行交換的項的位置,依次減1,第一次的位置n-1
PHP知識點--數組