PHP上传CSV生成数组后如何批量修改query字段值为URL的keywords参数
解决方案
实现逻辑说明
你之前批量处理数组不生效的核心原因是没有正确遍历修改数组内的元素值,我们可以在CSV逐行读取时就直接处理query字段,避免后续二次遍历。
优先推荐用PHP原生的URL解析函数处理,比手动截取字符串兼容性更强:
- 用
parse_url()提取URL中的查询参数部分 - 用
parse_str()把查询参数解析为关联数组 - 取出
keywords参数的值后做URL解码,即可得到目标文本
完整可运行代码
<form enctype='multipart/form-data' action='' method='post'> <label>Upload CSV file Here</label><br> <input size='50' type='file' name='filename' accept=".csv"><br> <input type='submit' name='submit' value='Upload File'> </form> <?php if (isset($_POST['submit'])) { // 增加上传错误校验 if ($_FILES['filename']['error'] !== UPLOAD_ERR_OK) { die("文件上传失败,请重试"); } $file = fopen($_FILES['filename']['tmp_name'], "r"); $all_rows = []; $header = fgetcsv($file); while ($row = fgetcsv($file)) { $item = array_combine($header, $row); // 处理query字段 $queryUrl = $item['query']; // 提取URL的查询参数部分 $queryPart = parse_url($queryUrl, PHP_URL_QUERY); // 解析参数为关联数组 parse_str($queryPart, $params); // 解码后赋值回query字段 $item['query'] = urldecode($params['keywords']); $all_rows[] = $item; } fclose($file); echo "<pre>"; print_r($all_rows); echo "</pre>"; } ?>
固定分隔符截取方案
如果你确定&keywords=和&origin=的位置永远固定,也可以用以下逻辑替换上面的query处理部分:
// 截取&keywords=之后的内容 $afterKeywords = strstr($queryUrl, '&keywords='); // 去掉&keywords=前缀 $afterKeywords = substr($afterKeywords, strlen('&keywords=')); // 截取到&origin=之前的内容 $keywordsValue = strstr($afterKeywords, '&origin=', true); // 解码赋值 $item['query'] = urldecode($keywordsValue);
内容的提问来源于stack exchange,提问作者simple
相关产品推荐
相关产品推荐

