常見需求:將扁平字串 1|蘋果|30 1|桃子|50 2|小麥|100... 依首欄位分組,轉為多維陣列:
Array
(
[1] => Array ( [0] => 1|蘋果|30, [1] => 1|桃子|50, ... )
[2] => Array ( [0] => 2|小麥|100, [1] => 2|玉米|35, ... )
...
)
<?php
$str = "1|蘋果|30 1|桃子|50 1|普通|10 2|小麥|100 2|玉米|35 2|大米|30 3|電腦|5 3|MP3|121 3|打印機|8";
// 1. 先按空白/換行分割成單條記錄
$strArray = explode("\n", $str); // 若實際為空白分隔,用 preg_split('/\s+/', $str)
// 2. 遍歷分組
$result = [];
foreach ($strArray as $item) {
$itemArray = explode('|', $item);
$key = $itemArray[0]; // 首欄作為分組鍵
$result[$key][] = $item; // 直接存原字串,或存結構化陣列
}
print_r($result);
$result = [];
foreach ($strArray as $item) {
[$id, $name, $value] = explode('|', $item);
$result[$id][] = [
'id' => (int)$id,
'name' => $name,
'value' => (int)$value,
];
}
explode 全載入記憶體,改用 fopen + fgets 逐行處理。strpos + substr 比 explode 略快。| 輸入格式 | 分割策略 | 分組鍵 |
|---|---|---|
| CSV 檔案 | fgetcsv() | 指定欄位 |
| JSON Lines | json_decode($line, true) | 指定欄位 |
| 固定寬度 | unpack() 或 substr() | 指定位置 |
掌握「分割 → 分組 → 結構化」三步驟,靈活應對各類扁平資料轉換需求。