PHP explode() 與 implode()

explode() 用來將字串分割成陣列,implode() 用來將陣列合併成字串。這兩個函數經常搭配使用。

explode() - 分割字串

基本用法

<?php
$str = "apple,banana,orange";

$arr = explode(",", $str);

print_r($arr);
// Array ( [0] => apple [1] => banana [2] => orange )
?>

語法

explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
  • $separator:分隔符
  • $string:要分割的字串
  • $limit:(可選)最大分割數量
  • 回傳值:分割後的陣列

使用 limit 參數

<?php
$str = "a,b,c,d,e";

// 正數 limit:最多分割成 N 個元素
print_r(explode(",", $str, 2));
// ['a', 'b,c,d,e']

print_r(explode(",", $str, 3));
// ['a', 'b', 'c,d,e']

// 負數 limit:去除最後 N 個元素
print_r(explode(",", $str, -1));
// ['a', 'b', 'c', 'd']

print_r(explode(",", $str, -2));
// ['a', 'b', 'c']
?>

分隔符不存在時

<?php
$str = "Hello World";

$arr = explode(",", $str);
print_r($arr);
// ['Hello World'](原字串作為唯一元素)
?>

多字元分隔符

<?php
$str = "apple--banana--orange";

$arr = explode("--", $str);
print_r($arr);
// ['apple', 'banana', 'orange']
?>

implode() / join() - 合併陣列

基本用法

<?php
$arr = ['apple', 'banana', 'orange'];

echo implode(",", $arr);   // apple,banana,orange
echo implode(", ", $arr);  // apple, banana, orange
echo implode("", $arr);    // applebananaorange
?>

語法

implode(string $separator, array $array): string
  • $separator:分隔符
  • $array:要合併的陣列
  • 回傳值:合併後的字串
join()implode() 的別名,兩者完全相同。

空陣列

<?php
$arr = [];
echo implode(",", $arr);  // ""(空字串)
?>

常見應用

處理 CSV 資料

<?php
$csv = "Alice,25,Taipei,Engineer";

// 分割
$fields = explode(",", $csv);
[$name, $age, $city, $job] = $fields;

echo "Name: $name, Age: $age";

// 修改後合併
$fields[1] = 26;  // 更新年齡
$newCsv = implode(",", $fields);
echo $newCsv;  // Alice,26,Taipei,Engineer
?>

處理路徑

<?php
$path = "/home/user/documents/file.txt";

// 分割路徑
$parts = explode("/", $path);
print_r($parts);
// ['', 'home', 'user', 'documents', 'file.txt']

// 取得檔名
$filename = end($parts);
echo $filename;  // file.txt

// 取得目錄
array_pop($parts);
$dir = implode("/", $parts);
echo $dir;  // /home/user/documents
?>

處理 URL 查詢字串

<?php
$query = "name=Alice&age=25&city=Taipei";

// 分割成參數
$pairs = explode("&", $query);
$params = [];

foreach ($pairs as $pair) {
    [$key, $value] = explode("=", $pair);
    $params[$key] = $value;
}

print_r($params);
// ['name' => 'Alice', 'age' => '25', 'city' => 'Taipei']

// 實際上應該使用 parse_str()
parse_str($query, $params);
?>

建立 SQL IN 條件

<?php
$ids = [1, 2, 3, 4, 5];

// 建立 IN 條件
$inClause = implode(",", $ids);
$sql = "SELECT * FROM users WHERE id IN ($inClause)";
echo $sql;
// SELECT * FROM users WHERE id IN (1,2,3,4,5)

// 對於字串,需要加引號
$names = ['Alice', 'Bob', 'Charlie'];
$quoted = array_map(fn($n) => "'$n'", $names);
$inClause = implode(",", $quoted);
$sql = "SELECT * FROM users WHERE name IN ($inClause)";
// 注意:實際應用中應該使用預處理語句避免 SQL Injection
?>

處理標籤

<?php
// 使用者輸入的標籤
$input = "PHP, JavaScript,  Python  , Ruby";

// 清理並分割
$tags = explode(",", $input);
$tags = array_map('trim', $tags);
$tags = array_filter($tags);  // 移除空值
$tags = array_unique($tags);  // 移除重複

print_r($tags);
// ['PHP', 'JavaScript', 'Python', 'Ruby']

// 轉回字串儲存
$tagString = implode(",", $tags);
?>

處理多行文字

<?php
$text = "Line 1\nLine 2\nLine 3";

// 分割成行
$lines = explode("\n", $text);

// 處理每一行
$processed = array_map(fn($line) => "- $line", $lines);

// 合併
echo implode("\n", $processed);
// - Line 1
// - Line 2
// - Line 3
?>

反轉單字順序

<?php
$str = "Hello World PHP";

$words = explode(" ", $str);
$reversed = array_reverse($words);
$result = implode(" ", $reversed);

echo $result;  // PHP World Hello
?>

首字母縮寫

<?php
function getInitials(string $name): string {
    $words = explode(" ", $name);
    $initials = array_map(fn($w) => strtoupper($w[0]), $words);
    return implode("", $initials);
}

echo getInitials("John Doe");           // JD
echo getInitials("Alice Bob Charlie");  // ABC
?>

注意事項

空分隔符

<?php
// explode 不能使用空分隔符
// $arr = explode("", "Hello");  // 錯誤!

// 使用 str_split 代替
$arr = str_split("Hello");
print_r($arr);
// ['H', 'e', 'l', 'l', 'o']
?>

連續分隔符

<?php
$str = "a,,b,,c";

$arr = explode(",", $str);
print_r($arr);
// ['a', '', 'b', '', 'c'](包含空字串)

// 使用 array_filter 移除空值
$arr = array_filter(explode(",", $str), fn($v) => $v !== '');
print_r(array_values($arr));
// ['a', 'b', 'c']
?>

關聯陣列

<?php
$arr = ['name' => 'Alice', 'age' => 25];

// implode 只使用值,忽略鍵
echo implode(", ", $arr);  // Alice, 25

// 如果需要包含鍵
$pairs = [];
foreach ($arr as $key => $value) {
    $pairs[] = "$key=$value";
}
echo implode("&", $pairs);  // name=Alice&age=25

// 使用 http_build_query 更方便
echo http_build_query($arr);  // name=Alice&age=25
?>

與其他函數比較

函數說明
explode()用字串分割
preg_split()用正規表示式分割
str_split()按長度分割成字元陣列
implode() / join()用分隔符合併陣列
<?php
$str = "a1b2c3d";

// explode 只能用固定分隔符
// preg_split 可以用正規表示式
$arr = preg_split('/\d/', $str);
print_r($arr);
// ['a', 'b', 'c', 'd']
?>