join() 是 implode() 的別名,用於將陣列元素以指定分隔符連接成字串。這是 PHP 中處理陣列輸出、構建 SQL 查詢、生成 CSV 等場景的核心函數。
string implode(string $separator, array $array): string
// 歷史原因支援反序 (不推薦)
string implode(array $array): string // 分隔符預設為空字串
最佳實踐:永遠使用 implode($separator, $array) 順序,避免歧義。
<?php
$arr = ['hello', 'world!', 'beautiful', 'day!'];
// 空格連接
echo implode(' ', $arr); // "hello world! beautiful day!"
// 逗號連接 (CSV 風格)
echo implode(',', $arr); // "hello,world!,beautiful,day!"
// 無分隔符連接
echo implode('', $arr); // "helloworld!beautifulday!"
// 多字符分隔符
echo implode(' | ', $arr); // "hello | world! | beautiful | day!"
?>
這是 implode() 最經典的應用場景之一:
<?php
class SearchBuilder {
private $conditions = [];
private $params = [];
public function addCondition(string $column, $value, string $operator = '='): self {
if ($value !== null && $value !== '') {
$placeholder = ':' . count($this->params);
$this->conditions[] = "`$column` $operator $placeholder";
$this->params[$placeholder] = $value;
}
return $this;
}
public function addInCondition(string $column, array $values): self {
if (!empty($values)) {
$placeholders = [];
foreach ($values as $val) {
$ph = ':' . count($this->params);
$placeholders[] = $ph;
$this->params[$ph] = $val;
}
$this->conditions[] = "`$column` IN (" . implode(',', $placeholders) . ")";
}
return $this;
}
public function addBetweenCondition(string $column, $min, $max): self {
if ($min !== null) {
$phMin = ':' . count($this->params);
$this->conditions[] = "`$column` >= $phMin";
$this->params[$phMin] = $min;
}
if ($max !== null) {
$phMax = ':' . count($this->params);
$this->conditions[] = "`$column` <= $phMax";
$this->params[$phMax] = $max;
}
return $this;
}
public function build(): array {
$where = $this->conditions ? 'WHERE ' . implode(' AND ', $this->conditions) : '';
return ['where' => $where, 'params' => $this->params];
}
}
// 使用範例
$builder = new SearchBuilder();
$builder->addCondition('status', 1)
->addCondition('type', 'article')
->addInCondition('category_id', [1, 3, 5, 7])
->addBetweenCondition('created_at', '2024-01-01', '2024-12-31');
$result = $builder->build();
$sql = "SELECT * FROM articles $result[where] ORDER BY created_at DESC";
// 執行: $stmt = $pdo->prepare($sql); $stmt->execute($result['params']);
?>
<?php
class DedeSearchBuilder {
public $starttime = 0;
public $typeid = 0;
public $channeltype = 0;
public $mid = 0;
public $ksql = '';
public $addsql = '';
public function buildConditions(): void {
$ksqls = [];
if ($this->starttime > 0) {
$ksqls[] = "arc.senddate > '" . intval($this->starttime) . "'";
}
if ($this->typeid > 0) {
// 假設 getSonIds() 返回字串 "1,2,3"
$ksqls[] = "typeid IN (" . $this->getSonIds($this->typeid) . ")";
}
if ($this->channeltype > 0) {
$ksqls[] = "arc.channel = '" . intval($this->channeltype) . "'";
}
if ($this->mid > 0) {
$ksqls[] = "arc.mid = '" . intval($this->mid) . "'";
}
// 基礎條件:只顯示通過審核的文檔
$ksqls[] = "arc.arcrank > -1";
// 核心邏輯:用 implode 組合條件
$baseSql = implode(' AND ', $ksqls);
$this->addsql = $this->ksql
? $baseSql . " AND (" . $this->ksql . ")"
: $baseSql;
}
private function getSonIds($typeid): string {
// 實際應連接數據庫查詢子分類
return $typeid . ",2,3"; // 模擬返回
}
}
// 使用
$search = new DedeSearchBuilder();
$search->starttime = strtotime('2024-01-01');
$search->typeid = 5;
$search->buildConditions();
echo "最終 SQL 條件: " . $search->addsql;
// 輸出類似: arc.senddate > '1704067200' AND typeid IN (5,2,3) AND arc.arcrank > -1
?>
<?php
$empty = [];
echo implode(',', $empty); // 返回空字串 "", 不會報錯
// SQL 構建時需注意
$conditions = [];
$where = $conditions ? 'WHERE ' . implode(' AND ', $conditions) : '';
// $where 為空字串,SQL 保持 "SELECT * FROM table"
?>
<?php
$data = ['a,b', 'c', 'd'];
// 錯誤:直接 implode 會產生歧義
echo implode(',', $data); // "a,b,c,d" - 無法區分原始 'a,b' 還是 'a' 和 'b'
// 正確:使用無衝突分隔符或編碼
echo implode('||', $data); // "a,b||c||d"
// 或 JSON 編碼每個元素
echo implode(',', array_map('json_encode', $data)); // "\"a,b\",\"c\",\"d\""
?>
<?php
$matrix = [
[1, 2, 3],
[4, 5],
[6, 7, 8, 9]
];
// 方法一:array_merge + implode
echo implode(',', array_merge(...$matrix)); // "1,2,3,4,5,6,7,8,9"
// 方法二:array_walk_recursive (保留鍵值關係)
$flat = [];
array_walk_recursive($matrix, function($v) use (&$flat) { $flat[] = $v; });
echo implode(',', $flat);
?>
<?php
class User {
public function __construct(public string $name, public string $email) {}
}
$users = [
new User('Alice', 'alice@example.com'),
new User('Bob', 'bob@example.com'),
new User('Charlie', 'charlie@example.com')
];
// 提取所有 email 並連接
$emails = array_column($users, 'email');
echo implode('; ', $emails); // "alice@example.com; bob@example.com; charlie@example.com"
// 箭頭函數簡寫 (PHP 7.4+)
$names = implode(', ', array_map(fn($u) => $u->name, $users));
?>
implode() 是 C 層實現,極快,百萬級陣列毫秒級完成$str .= ...),改用陣列收集最後 implode()<?php
// ❌ 慢:循環拼接字串 (記憶體重複分配)
$str = '';
for ($i = 0; $i < 100000; $i++) {
$str .= "$i,";
}
// ✅ 快:陣列收集 + implode
$arr = [];
for ($i = 0; $i < 100000; $i++) {
$arr[] = $i;
}
$str = implode(',', $arr);
?>
implode()/join() 是 PHP 開發者工具箱中的瑞士軍刀。從簡單的字串輸出到複雜的 SQL 動態構建,掌握其用法與最佳實踐,能顯著提升代碼的可讀性、安全性與效能。