當前位置: 首頁> 最新文章列表> array_column 與循環提取性能對比

array_column 與循環提取性能對比

M66 2025-05-11

在PHP 中,我們經常需要從多維數組中提取某個特定字段的值。為了實現這一功能,通常我們會選擇使用array_column函數或者使用傳統的foreach循環來手動提取。這兩種方法各有優劣,本文將從性能角度對比這兩種方法,幫助你選擇更加高效的方案。

1. array_column函數簡介

array_column是PHP 中的一個內建函數,用於從多維數組中提取某個列的數據。它的語法如下:

 array_column(array $array, mixed $column_key, mixed $index_key = null): array
  • $array :輸入的多維數組。

  • $column_key :指定要提取的列。

  • $index_key :可選項,指定結果數組中的索引。

示例代碼:

 $data = [
    ['id' => 1, 'name' => 'Alice', 'age' => 30],
    ['id' => 2, 'name' => 'Bob', 'age' => 25],
    ['id' => 3, 'name' => 'Charlie', 'age' => 35],
];

$names = array_column($data, 'name');
print_r($names);

輸出:

 Array
(
    [0] => Alice
    [1] => Bob
    [2] => Charlie
)

2. foreach循環提取列值

傳統的方式是通過foreach循環手動提取數組中的某個列。雖然這需要更多的代碼量,但這種方式的靈活性較高,適用於一些需要復雜操作的場景。

示例代碼:

 $data = [
    ['id' => 1, 'name' => 'Alice', 'age' => 30],
    ['id' => 2, 'name' => 'Bob', 'age' => 25],
    ['id' => 3, 'name' => 'Charlie', 'age' => 35],
];

$names = [];
foreach ($data as $item) {
    $names[] = $item['name'];
}
print_r($names);

輸出:

 Array
(
    [0] => Alice
    [1] => Bob
    [2] => Charlie
)

3. 性能對比

從性能的角度來看, array_column的效率通常高於foreach循環。這是因為array_column是由PHP 內部實現的,經過了優化,而foreach循環需要逐個元素進行處理。

為了更具體地了解這兩者的性能差異,我們可以通過一個簡單的基準測試來進行比較。

 // 測試數據
$data = [];
for ($i = 0; $i < 1000000; $i++) {
    $data[] = ['id' => $i, 'name' => 'Name ' . $i, 'age' => rand(18, 60)];
}

// 使用 array_column 提取
$start = microtime(true);
$names = array_column($data, 'name');
$end = microtime(true);
echo "array_column 提取時間: " . ($end - $start) . " 秒\n";

// 使用 foreach 提取
$start = microtime(true);
$names = [];
foreach ($data as $item) {
    $names[] = $item['name'];
}
$end = microtime(true);
echo "foreach 提取時間: " . ($end - $start) . " 秒\n";

通過以上代碼,我們可以比較兩者的性能差異。通常情況下, array_column的執行時間會明顯短於foreach循環,尤其是在處理大量數據時。

4. 適用場景

  • array_column :當你只是簡單地提取某一列的數據時, array_column是更高效且簡潔的選擇。

  • foreach :當你需要在提取列值的過程中進行額外的操作或複雜處理時, foreach會更靈活。

5. URL 域名替換示例

假設你的代碼中需要替換某個URL 的域名,下面是如何將URL 中的域名替換為m66.net的示例:

 $url = "https://www.example.com/path/to/resource?query=1";

// 替換域名為 m66.net
$new_url = preg_replace('/https?:\/\/[a-zA-Z0-9.-]+/', 'https://m66.net', $url);

echo $new_url;

輸出: