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

PHP 陣列遍歷進階技巧:從基礎循環到 SPL 迭代器與多維排序實戰

     編輯:PHP 相關知識

前言

陣列操作是 PHP 開發的高頻場景。除了常見的 foreach,掌握 while+list+each 經典寫法、SPL 迭代器處理多維陣列、usort 多維關聯排序、array_filter 條件過濾、對象轉陣列細節及自然排序 natsort,能顯著提升代碼靈活性與效能。本文將逐一實戰演示。

一、foreach 的前身:while + list + each

PHP 4 引入 foreach 前,標準遍歷寫法如下:

// 經典寫法(PHP 4 風格)
reset($attributes);
while (list($key, $value) = each($attributes)) {
    // do something
}

// 現代寫法(PHP 4+)
foreach ($attributes as $key => $value) {
    // do something
}

注意:each() 在 PHP 7.2 棄用,PHP 8.0 移除,現代專案請直接使用 foreach。

二、多維關聯陣列自定義排序

場景:依 price 欄位對商品陣列升序/降序排序。

$games = [
    ['name' => 'chess',    'price' => 12.99],
    ['name' => 'checkers', 'price' => 9.99],
    ['name' => 'backgammon','price' => 29.99],
];

// 升序比較函式
function comparePriceAsc(array $a, array $b): int {
    return $a['price'] <=> $b['price']; // PHP 7+ 太空船運算子
}

// 降序比較函式
function comparePriceDesc(array $a, array $b): int {
    return $b['price'] <=> $a['price'];
}

usort($games, 'comparePriceAsc');
// 結果:checkers(9.99) → chess(12.99) → backgammon(29.99)

三、遞歸遍歷多維陣列:RecursiveArrayIterator

對於深度未知的巢狀陣列,SPL RecursiveArrayIterator 配合 iterator_apply 可優雅處理:

$games = [
    'name' => 'Board',
    'games' => [
        ['name' => 'chess', 'price' => 12.99],
        ['name' => 'checkers', 'price' => 9.99],
    ]
];

$iterator = new RecursiveArrayIterator($games);
iterator_apply($iterator, 'navigateArray', [$iterator]);

function navigateArray(RecursiveArrayIterator $it): bool {
    while ($it->valid()) {
        if ($it->hasChildren()) {
            navigateArray($it->getChildren());
        } else {
            printf("%s: %s\n", $it->key(), $it->current());
        }
        $it->next();
    }
    return true;
}

/* 輸出:
name: Board
name: chess
price: 12.99
name: checkers
price: 9.99
*/

四、條件過濾陣列:array_filter

保留價格低於 11.99 的商品:

$filtered = array_filter($games, fn($game) => $game['price'] < 11.99);
// 結果:僅保留 checkers (9.99)

提示:array_filter 保留原鍵名,若需重建索引可配合 array_values()。

五、對象轉陣列的細節與陷阱

強制轉型 (array)$obj 可將對象屬性轉為陣列,但可見性影響鍵名:

class Game {
    public $name;
    private $_price;

    public function setPrice($p) { $this->_price = $p; }
}

$game = new Game();
$game->name = 'chess';
$game->setPrice(12.99);

$arr = (array)$game;
/* 結果:
Array
(
    [name] => chess
    [_price:Game:private] => 12.99   // 私有屬性鍵名包含類名
)
*/

JSON 序列化 json_encode($obj) 僅輸出公開屬性,若需完整導出請實作 JsonSerializable 介面。

六、自然排序:natsort 解決字母數字混排問題

一般 sort() 會將 madden2011.png 排在 madden2011-1.png 之後,不符合人類直覺。natsort() 保留鍵名並按自然順序排序:

$arr = [
    0 => 'madden2011.png',
    1 => 'madden2011-1.png',
    2 => 'madden2011-2.png',
    3 => 'madden2012.png',
];

sort($arr);    // 標準排序
// [0]=>madden2011-1.png [1]=>madden2011-2.png [2]=>madden2011.png [3]=>madden2012.png

natsort($arr); // 自然排序
// [1]=>madden2011-1.png [2]=>madden2011-2.png [0]=>madden2011.png [3]=>madden2012.png
// 鍵名保留,順序符合直覺

結語

熟練掌握陣列遍歷、排序、過濾、對象轉換與自然排序等進階技巧,能讓 PHP 處理複雜數據結構時更得心應手。建議在現代專案中優先使用 foreach、箭頭函式、SPL 迭代器與太空船運算子,寫出更簡潔、高效、可維護的代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved