陣列操作是 PHP 開發的高頻場景。除了常見的 foreach,掌握 while+list+each 經典寫法、SPL 迭代器處理多維陣列、usort 多維關聯排序、array_filter 條件過濾、對象轉陣列細節及自然排序 natsort,能顯著提升代碼靈活性與效能。本文將逐一實戰演示。
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)
對於深度未知的巢狀陣列,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
*/
保留價格低於 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 介面。
一般 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 迭代器與太空船運算子,寫出更簡潔、高效、可維護的代碼。