PHP 碎片筆記:字符串分割 (split/preg_split/explode)、fetch 函數差異、單雙引號本質
整理學習過程中的三個易混淆知識點,作為快速查閱備忘。
一、字符串分割三把斧
| 函數 | 分隔符類型 | 正則風格 | 二進制安全 | 狀態 |
split() | 正則 | POSIX | ❌ 非安全 | PHP 5.3 棄用, 7.0 移除 |
preg_split() | 正則 | PCRE (Perl) | ✅ 安全 | 推薦正則分割 |
explode() | 固定字符串 | 無 | ✅ 安全 | **最快、首選非正則場景** |
代碼對比:分割 "2008-12-16 15:48:12"
<?php
$str = "2008-12-16 15:48:12";
// split (已棄用) - POSIX 字符類
// $arr = split('[- :]', $str);
// preg_split - PCRE 字符類
$arr = preg_split("/[\s-:]/", $str);
// Array ( [0]=>2008 [1]=>12 [2]=>16 [3]=>15 [4]=>48 [5]=>12 )
// explode - 需多次調用或配合 str_replace
$arr = explode(' ', $str); // 先按空格
$date = explode('-', $arr[0]);
$time = explode(':', $arr[1]);
二進制安全:指函數僅按字節處理數據,不解釋特殊字符 (如 NULL \0)、不按編碼語義截斷。preg_split、explode 均為二進制安全;舊 split 非安全,遇 \0 會提前結束。
二、mysqli_fetch_row vs mysqli_fetch_array
<?php
$result = mysqli_query($link, "SELECT id, name FROM user");
// fetch_row → 純數字索引
while ($row = mysqli_fetch_row($result)) {
echo $row[0] . ':' . $row[1]; // 1:Tom
}
// fetch_array → 默認雙份 (數字+關聯)
$row = mysqli_fetch_array($result);
// Array ( [0]=>1 [id]=>1 [1]=>Tom [name]=>Tom )
// 可選模式
mysqli_fetch_array($result, MYSQLI_ASSOC); // 只關聯
mysqli_fetch_array($result, MYSQLI_NUM); // 只數字 (同 fetch_row)
mysqli_fetch_array($result, MYSQLI_BOTH); // 默認雙份
fetch_row:性能最好、內存最小,適合大數據導出、統計。
fetch_array:功能最全,但默認雙份佔用雙倍內存,**生產代碼建議顯式指定 MYSQLI_ASSOC**。
- 手冊稱兩者性能差異微小,
fetch_array 是增強版。
三、單引號 vs 雙引號:本質區別
| 特性 | 單引號 '...' | 雙引號 "..." |
| 解析變量 | ❌ 不解析,原樣輸出 $var | ✅ 解析變量 {$var} |
| 轉義字符 | 僅 \' \\ | 完整支持 \n \t \r \" \\ \$ 等 |
| 執行速度 | 略快 (無解析開銷) | 略慢 |
| 適用場景 | 純文本、SQL 語句、不含變量的字符串 | 需嵌入變量、換行符、複雜轉義 |
<?php
$name = 'Tom';
echo 'Hello $name'; // Hello $name
echo "Hello $name"; // Hello Tom
echo "Hello {$name}"; // Hello Tom (複雜表達式推薦加花括號)
// SQL 寫法推薦單引號,防止誤觸發變量解析
$sql = 'SELECT * FROM user WHERE name = "Tom"'; // 雙引號在 SQL 字符串中
核心概念區分:
- 變量:數據的符號引用 (如
$name)
- 字符串/文本:數據本身 (字面值)
- 單引號字符串 = 純文本數據;雙引號字符串 = 可解析的模板
參考資料