首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP each() 與 list() 組合遍歷數組:原理深度剖析與現代替代方案

     編輯:PHP 相關知識

each() + list() 經典遍歷模式:從原理到棄用的完整生命週期

在 foreach 普及前,each() 配合 list() 是 PHP 遍歷數組的標準姿勢。本文深度剖析 each() 內部指針機制、list() 從右到左賦值邏輯、兩者結合的執行流程,並說明為何 PHP 7.2 棄用、8.0 移除 each(),給出現代最佳替代寫法。

each() 核心機制

array each ( array &$array )
  • 返回當前鍵值對並**將內部指針前移一位**。
  • 返回數組結構:[1=>value, 'value'=>value, 0=>key, 'key'=>key](數字鍵 0/1 和字符串鍵 key/value 並存)。
  • 指針到達末尾返回 false,需 reset($arr) 重置。
  • 副作用:直接操作數組指針,多處並發遍歷同一數組會互相干擾。

list() 賦值邏輯回顧

  • 語法構造,非函數。
  • 從右到左賦值:list($a,$b) = [1,2] 先執行 $b=2 再 $a=1。
  • 按索引位置匹配:$a 對應索引 0,$b 對應索引 1。
  • 若右側數組缺少對應索引,拋 Notice 並賦值 null。

經典組合遍歷代碼

<?php
$arr = ['你','若','安','好','便','是','晴','天'];

// 寫法 1:for 循環 + list/each
for ( ; list($k, $v) = each($arr); ) {
    echo "$k ~ $v\n";
}

// 寫法 2:while 循環(等價)
reset($arr);
while (list($k, $v) = each($arr)) {
    echo "$k ~ $v";
}

// 輸出:
// 0 ~ 你
// 1 ~ 若
// 2 ~ 安
// 3 ~ 好
// 4 ~ 便
// 5 ~ 是
// 6 ~ 晴
// 7 ~ 天
?>

執行流程逐幀解析

  1. reset($arr) 指針指向索引 0。
  2. each($arr) 返回 [1=>'你', 'value'=>'你', 0=>0, 'key'=>0],指針移至索引 1。
  3. list($k, $v) = ...:
    - 右側數組索引 0 值為 0,索引 1 值為 '你'。
    - 從右到左:$v = '你',$k = 0。
    - 返回值為該數組(非 false),循環繼續。
  4. 重複直到 each() 返回 false,循環結束。

list() 陷阱實例:鍵名不匹配

<?php
// 鍵名為 2,3,4,1 的非連續數組
list($a, $b, , $c) = [2=>10, 3=>20, 4=>30, 1=>40];
// 索引分布:0缺, 1=40, 2=10, 3=20, 4=30
// list 期望:$a=索引0, $b=索引1, $c=索引3
// 從右到左賦值:
// $c = 索引3 = 20
// $b = 索引1 = 40
// $a = 索引0 = Notice(缺失) -> null
// 結果:$a=null, $b=40, $c=20
?>

為何棄用 each()?

PHP 7.2 拋出 Deprecated 警告,PHP 8.0 徹底移除。

現代最佳替代方案

<?php
$arr = ['你','若','安','好'];

// 1. foreach (首選,語義清晰、支援所有可遍歷對象)
foreach ($arr as $k => $v) { ... }

// 2. array_values + list 解包(需固定結構數組)
list($a, $b, $c, $d) = array_values($arr);

// 3. 解構賦值語法 [] (PHP 7.1+)
[$a, $b, $c, $d] = array_values($arr);

// 4. 帶鍵名解包 (PHP 7.1+)
$data = ['id'=>1, 'name'=>'Tom'];
['name' => $name, 'id' => $id] = $data;
?>

總結

each() + list() 是 PHP 早期無 foreach 時代的產物,理解其「指針前移 + 從右到左賦值 + 索引位置匹配」機制有助於維護舊代碼。新代碼**毫無理由使用**,foreach 與 [] 解構語法在可讀性、性能、功能性上全方位碾壓。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
缺陷影響
內部指針全局共享巢狀循環、多處遍歷同一數組會相互干擾指針位置
不支援迭代器/對象無法遍歷 Traversable、Generator、ArrayObject
性能劣於 foreach每次調用需複製返回數組結構,foreach 直接操作內部 HashTable
語義不清副作用隱含在函數調用中,違反函數式純粹性