1. 程式人生 > 程式設計 >PHP 陣列操作詳解【遍歷、指標、函式等】

PHP 陣列操作詳解【遍歷、指標、函式等】

本文例項總結了PHP 陣列操作。分享給大家供大家參考,具體如下:

陣列

資料由元素組成,元素由鍵和值組成

陣列分類

關聯陣列
關聯陣列,元素的下標與元素的值存在邏輯上的關係,稱之為關聯陣列。指的是,鍵和值之間存在管理。

$a1 = array('name' => '李尋歡','age' => 34);  

索引陣列
索引陣列,元素的值和下標不存在邏輯關係,而下標只表示值索引位置。

$a1 = array('李尋歡',34);

陣列遍歷

所要的完成遍歷陣列,需要依次得到每個元素的資訊(鍵的資訊和值的資訊).核心在於陣列的元素指標上

陣列的元素指標

每一個數組內的,都有一個內部的指向某個元素的指標。

預設情況下,這個指標指向陣列的第一個元素.
每個陣列只有一個指標,同時時刻,只能指向一個元素,因此指標的位置,可以是任意一個已存在的元素。同時指標可能指向陣列的外部(陣列的末端[最後一個的外邊]),就是非法位置.

PHP 陣列操作詳解【遍歷、指標、函式等】

陣列遍歷就是
獲得指標指向的元素的資訊,移動指標,配合迴圈結構就可以完成。

php提供

  • 得到指標所指向的元素的資訊

  • 可以移動指標

current(); 得到當前指標指向元素的值
key(); 得到當前指向元素的鍵
next(); 可以移動陣列的指標

prev(); 向上移動一個元素.
reset(); 重置指標(移動到第一個元素)
end(); 移動到最右一個元素

陣列末端,最右一個元素往右,非法的範圍

next(),和prev(); 可以將陣列指標移動到非法位置上.

//$students 是陣列
end($students);
next($students);
var_dump(current($students)); //false;

reset($students);
prev($students);
var_dump(current($students)); //false;

如果已經移動到非法位置,不可相對移動來挽回,此時,需要強制移動到某個位置, reset(),和 end()

//$students 是陣列
end($students);
next($students);
prev($students);
var_dump(current($students)); //false;

reset($students);
prev($students);
next($students);
var_dump(current($students)); //false;

foreach()

foreach(); 結構
專門用於陣列遍歷的一個結構,也是一個迴圈結構

foreach ( $arr as $key => $val ) {
  //迴圈體
}

如果元素的鍵,沒有意義的話,可以使用 省略鍵的資訊

foreach ( $arr as $val ) {}

注意:

foreach會移動陣列指標,並且,在foreach遍歷完畢後,指標處於非法位置(陣列末端)
foreach在遍歷一個數組元素時,會初始化元素指標,因此指標所指向的位置,不會影響到foreach的遍歷
foreach在遍歷時,原陣列的拷貝,而不是直接在原陣列進行遍歷,如果在遍歷過程中,對遍歷的陣列進行修改,是不會影響到遍歷的結果
foreach所使用的儲存元素值的變數,對其操作,不會對原陣列產生影響
對值的操作,同時支援引用傳遞:可以改變原陣列的值。

只需要在變數前增加&符號 即可。

PHP 陣列操作詳解【遍歷、指標、函式等】

foreach流程圖

PHP 陣列操作詳解【遍歷、指標、函式等】

foreach也是迴圈結構, 受break和continue的控制。

each()

遍歷每一個
可以獲得當前的元素資訊。(鍵和值),同時向下移動指標
獲得元素資訊,返回的是, 關聯和索引陣列
其中:
關聯陣列部分。

key => 當前元素的鍵
value => 元素的值

索引陣列部分

0 => 元素的下標
1 => 元素的值

$arr = array(10,12,200);

$arr2 = array(
  'name' => 'zf','age' => 20
);

var_dump(each($arr));
var_dump(each($arr2));

只遍歷第一項
由於each既可以獲取元素資訊,又可以移動指標,因此非常適合完成除foreach外的手動的陣列的遍歷.

each+while+list的遍歷陣列

each如果指標非法,each返回false。 判斷each的返回值

// 先eaech,將each的結果賦給$element
// 判斷$element 是否成立(自動轉成布林型別)

while($element = each($sutdents)) {
  echo 'Key:',$element[0];
  echo '$nbsp;';
  echo 'Value:',$element[1];
  echo '<br/>';
}
  

list()
可以使在遍歷的迴圈體內直接使用儲存元素下標的變數.直接使用儲存元素下標的變數和儲存元素值的變數.
一個函式,可以通過一個數組,針對多個變數同時初始化

  
$student = array('李尋歡','天機老人','阿飛');

list($a,$b,$c) = $student; // 將陣列內的元素, 以此賦值給list結構中的變數  // 類似 es6 中的解構賦值

var_dump($a,$c);

list 針對索引陣列生效

$student = array('李尋歡','阿飛');

while (list($k,$v) = each($student)) {
  
  echo 'Key:',$k;
  
  echo '&nbsp;';
  
  echo 'Value:',$v;
  
  echo '<br/>';
  
};

陣列複製元素指標

如果原陣列指標合法:
陣列在複製時,指標位置也會隨之複製到目標陣列內.

$a1 = array('a','b','c');

$a2 = $a1;
var_dump(current($a2)); // a

echo '<hr/>';

$a1 = array('a','c');
next($a1);

$a2 = $a1;
var_dump(current($a2)); // b

如果原陣列指標非法:
將重置新陣列的指標; 重置為預設指標.

$a1 = array('a','c');

end($a1);

next($a1);

$a2 = $a1;

var_dump(current($a2)); // a

foreach與陣列指標關係

foreach對指標的影響有不確定性,因此不要依賴foreach遍歷後的指標位置,如果需要操作,需要先重置(reset();).

陣列遍歷的是,原陣列的拷貝,而不是直接在陣列上進行操作.
php內部優化,寫時複製(COW--copy on write) .如果不對原陣列執行寫操作. 是不會發生複製的過程. 在對原陣列進行寫操作時,這個複製的過程才會發生.
陣列複製時的指標問題

PHP 陣列操作詳解【遍歷、指標、函式等】

foreach遍歷的時候,是拷貝,但是發生在對原陣列進行操作之後.意味著,在寫操作之前,遍歷操作的就直接是原陣列. 一旦發生了寫操作,則會形成一個真實的拷貝,foreach去遍歷的陣列就與原陣列不是同一個. 因此原陣列指標就不會繼續發生變化. 唯一的例外在最後一次迴圈體內對陣列進行寫操作,此時在複製前指標已經非法,則結果會被重置.

在實際操作中,建議處理完畢後,可以立即reset();
上面的問題,只適用於$value ,儲存元素值的變數是值傳遞的情況,如果是引用傳遞的話.直接操作原陣列!
$key不能引用傳遞.

array函式

常用函式

array_fill(起始位置,長度,內容); //使用固定值填充某些數量的元素.
count(); //統計陣列元素個數. 支援遞迴統計.
range(起始範圍,結束範圍); //按照範圍建立陣列元素.
array_merge(); //合併多個數組.

// 注意一個下標衝突的情況,如果索引下標衝突,順序增加.
// 關聯陣列衝突. 後合併的要覆蓋前面的.
array_merge(range('a','z'),range('A','Z'));

array_rand(陣列,選擇的數量[預設一個]); //隨機從陣列中取得某些元素. 得到的是隨機的下標,而不是元素值. 並且,如果是多個元素,會按照下標的大小進行排序.

shuffe(); //打亂元素順序,引數是引用傳遞.

// 驗證碼中的 4位 隨機數

// 建立一個大小混合的陣列
$chars = array_merge(range('a','Z'));

// 取得4個元素下標

$rand_keys = array_rand($chars,4);

// 打亂
shuffle($rand_keys);

// 利用下標獲取元素值
foreach ($rand_keys as $v) {
  echo $chars[$v];
}
  

鍵值操作

array_value(); //取得所有元素的所有值.
array_key(); //取得所有元素的所有鍵.

array_combine(); // 利用兩個陣列,其中一個為 鍵 ,另一個為值得到一個新陣列.
in_array(); //判斷陣列中是否有某個值
array_key_exists(); //是否有某個元素.

array_search(); // 在陣列內查詢某個元素值,找到返回 下標. 找不到返回false.
array_filp(); // 交換元素的鍵和值.

合併拆分

'+'號

$a1 = array(1,2,3,4);
$a2 = array(6,7,8);
var_dump($a1+$a2); // 如果出現下標衝突,則忽略後邊的元素

array_merge($arr1,$arr2); // 合併多個數組.
array_chunk($arr,len); //按照子陣列的長度,進行對原陣列拆分.

explode(); //將一個字串,按照某個字元,分割成多個部分.
implode(); //可以將陣列元素的值, 利用某個字元,連線

$arr = array('aa','bb');

echo $arr = implode('-',$arr); // aa-bb

print_r(explode('-',$arr));

compact(); 合併, 利用多個變數,合併成一個數組. 其中變數的名字作為陣列的下標. 變數的值,作為值. 注意引數是變數名

$width = 2;
$height = 10;

$arr = compact('width','height');

extact(); 拆分,將一個變數,拆分成一個變數。每一個元素為一個變數。 下標為變數名,值為變數值. 字串的下標.
注意,如果當前已經存在變數名,則會發生將已有變數值替換的操作.這個是預設行為.可以修改,通過extact(),第二個引數. 預設為EXTR_OVERWRITE表示重寫 //EXTR_SKIP 表示略過.

PHP 陣列操作詳解【遍歷、指標、函式等】

array_diff(陣列1,陣列2); // 得到陣列1中與陣列2中不相同的元素. -- 差集 值判斷.
array_intersect(陣列1,陣列2);// 得到陣列1中與陣列2中相同的元素. --交集.

array_map($callback,$arr1); // 對陣列內的每個元素,進行一次操作.分別呼叫某個函式進行一次呼叫.
如果函式是自定義的.
注意,應該有引數接收元素值,同時應該有返回值

$a1 = array(10,20,3);

function x2 ( $item ) {
  return $item * 3;
}

$arr = array_map('x2',$a1);

var_dump($arr);

只負責定義,不負責呼叫. array_map(); 函式內部負責呼叫.
可以同時接收或處理.是統一操作,一次將所有陣列相同位置都操作一遍,而不是逐一操作. 因此該函式所接受的引數個數,與所傳遞的陣列的數量應該一致.
有一個預設操作,非常常用,利用多個數組,組合成一個新陣列。要求,函式位置傳遞一個null.

$names = array('z1','z2','z3');

$maths = array(50,40,60);

$score = array_map(null,$names,$maths);

var_dump($score);

回撥函式的使用-模擬資料結構函式-排序函式


array_walk($funcname);
針對一個數組的每個元素進行操作,與array_map的不同點.

  • array_map() 可以操作多個數組,而array_walk(); 只可以操作一個數組.

  • array_map(); 只可以得到元素值,而array_walk(); 即可以得到元素值,還可以得到元素的鍵.

  • 可以對函式的第一個引數進行引用傳遞,達到修改的原有陣列的目的.

$names = array('aa','bb','cc');

function fn1 ( &$val,$key ) {
  var_dump($val,$key);
}

array_walk($names,'fn1');

模擬資料結構

入棧 array_push();
出棧 array_pop();
// 每次操作後,索引都會重新索引.

頂端出: array_shift();
頂端入: array_unshift();

排序函式

soft(); 按照值升序
rsoft() 按照值降序
ksoft()按照鍵升序
krsoft(); 按照鍵降序
// 值排序,不會保留鍵值關係,而鍵排序會保留鍵值關係.
// 按照值排序,同時保留鍵值關係.

asort(); 按照值,升序,保留鍵值關聯.
arsort(); 按照值,降序,保留鍵值關聯.

key,鍵
reverse(): 反序,預設是升序.
association: 關聯

更多關於PHP相關內容感興趣的讀者可檢視本站專題:《PHP陣列(Array)操作技巧大全》、《PHP常用遍歷演算法與技巧總結》、《php字串(string)用法總結》、《php常用函式與技巧總結》、《PHP錯誤與異常處理方法總結》、《PHP基本語法入門教程》、《php面向物件程式設計入門教程》及《PHP數學運算技巧總結》

希望本文所述對大家PHP程式設計有所幫助。