1. 程式人生 > 實用技巧 >PHP基礎03---陣列

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是利用指標去獲取資料,同時移動指標。(指標訪問

  1. foreach會重置指標:讓指標指向第一個元素
  2. 進入foreach迴圈:通過指標取得第一個元素,然後將下標取出放到對應的下標變數中(存在的話),將值取出來放到對應的值變數中。指標下移

(對於上面的一維陣列遍歷就是下標放到$key,值放到$value

  1. 進入到迴圈體之後,開始執行。
  2. 重複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():獲取陣列的所有值,返回值也是一個索引陣列。