PHP生成含URL与标题的CSV异常:仅显示最后一个URL标题
问题原因与修复方案
问题根源
- 变量覆盖:你初始化了
$title = [],但在遍历URL的循环中,每次都将单个标题字符串赋值给$title,这会覆盖之前的所有结果,最终$title只保留最后一个URL的标题。 - 对应关系丢失:写入CSV时,所有URL都复用同一个
$title值,导致所有行都显示最后一个标题。
修复后的代码
<?php ini_set('max_execution_time', 0); // 设置为0表示无超时限制 include('simple_html_dom.php'); // 读取原始CSV文件的URL $arraydata = []; if (($csv_file = fopen("old.csv", "r")) !== FALSE) { while (($read_data = fgetcsv($csv_file, 1000, ",")) !== FALSE) { foreach ($read_data as $url) { // 过滤空URL,避免无效请求 if (!empty(trim($url))) { $arraydata[] = trim($url); } } } fclose($csv_file); } // 存储每个URL对应的标题 $urlTitles = []; foreach ($arraydata as $url) { $html = file_get_html($url); // 初始化标题为空,避免获取失败时无值 $title = ''; if ($html) { $titleElement = $html->find('title', 0); if ($titleElement) { $title = $titleElement->plaintext; // 清理标题中的换行、逗号等可能破坏CSV格式的字符 $title = str_replace(["\n", "\r", ","], ["", "", " "], $title); } // 释放DOM资源,避免内存泄漏 $html->clear(); unset($html); } $urlTitles[$url] = $title; } // 写入新的CSV文件 $ncsv = fopen("updated.csv", "w"); // 用w模式覆盖,避免重复追加表头 // 使用fputcsv处理CSV格式,自动处理特殊字符 fputcsv($ncsv, ["Url", "Title"]); foreach ($arraydata as $url) { fputcsv($ncsv, [$url, $urlTitles[$url]]); } fclose($ncsv); ?>
关键修改点
- 改用
$urlTitles数组存储每个URL对应的标题,保留URL与标题的对应关系。 - 使用
fputcsv替代fwrite,自动处理标题中的逗号、引号等特殊字符,保证CSV格式正确。 - 添加空URL过滤、标题清理、DOM资源释放的逻辑,提升代码稳定性和健壮性。
- 将文件打开模式从
a改为w,避免多次运行时重复追加表头和内容。
内容的提问来源于stack exchange,提问作者Abhisake Jain
相关产品推荐
相关产品推荐

