PHP基礎03---陣列
陣列
不妨先看一下度孃的解釋
定義語法
<?php //1.用array關鍵字 $變數 = array(元素1,元素2,元素3);//元素可以為不同型別 //2.用中括號 $變數 = [元素1,元素2,元素3]; //3.隱形定義陣列:(給變數增加一箇中括號,系統自動變成陣列 $變數[] = 值;//從0開始預設儲存,但是如果前面有下標了,下標預設從當前前面最大的開始 $變數[下標] = 值;//下表可以是字母(單詞)/數字 $a[] = 10; $a[10] = 11; $a[] = 12;//這時候下標在11
特點
-
1.可以用整數下標或字串下標。
如果下標都為整數下標:‘索引陣列’
如果下標都為字串(加引號):'關聯陣列'(類似python中的dict?
-
2.不同下標可以混合存在(混合陣列
-
3.陣列元素的順序以放入順序為準,跟下標無關
就是輸出的時候,如果不迴圈,就按著賦值順序輸出。(var_dump($a)
-
4.陣列下標的自增長特性:從0開始自動增長,如果中間出現較大的下標,從最大的下標+1重新開始增長
-
5.特殊值下標的自動轉換
-
6.php中陣列元素沒有型別限制
-
7.php中陣列元素原則上沒有長度限制
注意:PHP中陣列是很大的資料,儲存位置是堆區,為當前陣列分配連續的記憶體。
多維陣列
數組裡面的元素又是陣列。
二維陣列:
陣列中所有元素都是一維陣列。
<?php
$aa = array(
array('name' => 'ghj','score' => 99),
array('name' => 'gc','score' => 99),
array('name' => 'guz','score' => 0)
);
//其實就是套起來用。(不妨自己輸出試試
通常二維陣列不會兩個維度的下標都是數字,一般是一維為數字(無意義),二維為字串(資料庫表字段)。
多維陣列:
在二維裡面繼續套娃(php中沒有維度限制,但是php本質沒有二維陣列。 禁止套娃
異形陣列(不規則陣列:
陣列中的元素不規則,有普通基本變數也有陣列。(可能就是啥玩意都有?)
(開發中不常見。應該儘量讓陣列元素規則化,便於訪問
陣列遍歷
普通陣列資料的訪問都是通過下標來訪問。如果依次輸出,就能用foreach;(下標不規則通通用foreach
foreach
<?php
$a = array(0 => array('name') => 'ghj'),1 => array('name' => 'gc');
//訪問一維元素:
$a[0];
//訪問二維元素:(像c語言一樣
$a[0]['name'];
/*foreach遍歷語法:
foreach($陣列變數 as [$下標 => ]$值){
//通過 $下標 訪問元素的下標;通過 $值 來訪問元素值
}
如果是關聯陣列的時候,就需要下標。
如果是索引陣列,就直接訪問值(可以不要下標
*/
$aa = array(1,2,3,4,5,6,7,8,9,10);
foreach($aa as $key => $value){
//$key,$value寫成啥都行
//其中$key對應下標,$value對應值
echo $value,'<br/>';
}
//遍歷二維陣列
$bb = array(
array('name' => 'ghj','score' => 99),
array('name' => 'gc','score' => 99),
array('name' => 'guz','score' => 0)
);
foreach($bb as $val){
//1.foreach($val as $value)
/*2.直接通過下標訪問
echo $val['name'],' ',$val['score'];*/
}
foreach遍歷原理:
陣列內部有一顆指標,預設指向第一個元素。foreach是利用指標去獲取資料,同時移動指標。(指標訪問
- foreach會重置指標:讓指標指向第一個元素
- 進入foreach迴圈:通過指標取得第一個元素,然後將下標取出放到對應的下標變數中(存在的話),將值取出來放到對應的值變數中。指標下移
(對於上面的一維陣列遍歷就是下標放到$key,值放到$value
- 進入到迴圈體之後,開始執行。
- 重複2,3,直到取不到內容。
for
就是用for迴圈(很少用到
該怎麼做?
首先要確保陣列元素的下標是有規律有順序的數字。
要獲取陣列長度:count(陣列)
來得到陣列長度
<?php
$a = array(1,2,3,4,5,6,7,8,9);
$len = count($a);
for($i = 0;$i < len;$i++){
echo 'key is :',$i,' val is :',$a[$i],'<br/>';
}
while配合each和list遍歷陣列
(其實也可以用for。
each函式:each能夠從一個數組中獲取當前陣列指標指向元素的下標和值,拿到之後將陣列指標下移,同時返回拿到的元素下標和值以一個四個元素的陣列返回。
(each函式貌似棄用了,但是還是有可能會接觸到的
當each取不到東西的時候,會返回false。(var_dump可顯示
list函式:list是一種結構,沒有返回值的概念。list提供一堆變數去從一個數組中取得元素值,然後依次儲存到對應的變數中。(list必須從索引陣列中去獲取資料,必須從0開始。
(整段建議細讀,應該不難理解)
list()裡面的變數不可多於陣列元素。(只能按順序來,下面面的賦值如果改為```list(\(first,\)second) = $arr;``是不可行的(因為陣列中第二個是賦值的a[2]。
list 與each配合:
(一定注意理解兩個函式的意思與用法
each一定有兩個元素:0和1
list(變數1,變數2) = each(陣列);//是一種賦值運算,但是可以得到false結果(each取到不正確的),此時表示式為false
<?php
$a = array(1,'name' => 'ghj',3,'score' => 99);
while(each($a)){
list($key,$value) = each($a);
echo 'key is :',$key,' value is :',$value,'<br/>';
}
//注意each每次使用之後都會將指標下移!
//這時候只能輸出第二個和第四個
//像下面這樣寫就可以將四個都輸出:
while(list($key,$value) = each($a)){
echo 'key is :',$key,' value is :',$value,'<br/>';
}
//該怎麼理解呢?按我的理解來看就是each沒有取到空的時候的返回值都是true,就都可以執行。
陣列相關函式
所有的函式,詳見此處
1.排序函式:
(按ascii來進行比較 詳情可見此處
-
sort():升序排序。(下標會重置。
-
rsort():降序排序。
-
asort():按照元素的值進行升序排序。(下標會保留)(主要應用於關聯陣列
-
arsort():降序排序
怎麼來解釋呢,就比如說這樣(注意看下標
<?php $a = array(1,10,2,45,30); /* sort($a)後會得到這樣的結果 [0] => 1 [1] => 2 [2] => 10 [3] => 30 [4] => 45 */ /* 而asort($a)之後則是這樣的結果 [0] => 1 [2] => 2 [1] => 10 [4] => 30 [3] => 45 */
- ksort():按照鍵名進行升序排序(應用於關聯陣列
- krsort():降序排序。
- shuffle():隨機打亂陣列的值。
2.指標函式:
建議自己嘗試一下 詳見此處
- reset():重置指標,將陣列指標回到首位
- end():重置指標,將陣列指標指到最後一個元素
- next():指標下移,取得下一個元素的值
- prev():指標上移,取得上一個元素的值
- current():取得當前指標對應的元素值
- key():取得當前指標對應的下標值
注意:當next/prev函式使得指標越界之後,用這兩個是呼叫不回來的,需要用end/reset重置
3.其他函式
- count():統計陣列中元素數量(或者說長度?
- array_push(陣列,元素):在陣列尾部新加入一個元素
- array_pop(陣列,元素):從陣列尾部返回並刪除一個元素。(這兩個操作可理解成棧?
- array_shift(陣列,元素):從陣列頭部返回並刪除一個元素。
- array_unshift(陣列,元素,):從陣列頭部加入一個元素(這兩個可以理解成佇列?
- array_reverse():翻轉陣列元素
- in_array():判斷元素是否在陣列中。
- array_keys():獲取陣列的所有下標,返回值為一個索引陣列
- array_values():獲取陣列的所有值,返回值也是一個索引陣列。