如何从CSV文件提取含指定球队ID的主客场比赛数据
问题
我有一份记录约1700支球队足球赛事的CSV文件,包含11列数据,其中REGNUMBERHOME和REGNUMBERAWAY是主客场球队的ID字段。我已经把所有行转成数组,但当前用if(in_array($stamnr, $col)) {}只能获取该球队的主场比赛数据,想知道怎么修改代码同时获取主客场所有比赛数据。
我的PHP代码
<?php $reeks=""; if(!empty($_POST['myselection'])) { $reeks = $_POST['myselection']; echo "<h3><b>REEKS " .$reeks . "</b></h3>"; if (($handle = fopen("test/masterfile.csv", "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { $data = array_map("utf8_encode", $data); //added $num = count($data); for ($c=0; $c < $num; $c++) { $matchen = array(); $col = explode(';',$data[$c]); if(in_array($stamnr, $col)) { $date = str_replace('/', '-', $col[1]); $dag = substr($date, 0, 2); $maand = substr($date, 3, 2); $jaar = substr($date, 6, 4); $weekdag = getWeekDay($dag,$maand,$jaar); $col[1] = $weekdag."<br />". $col[1]; $matchen = $col[0]. ', ' .$col[1]. ', ' .$col[2]. ', ' .$col[3]. ', ' .$col[4].', ' .$col[5]. ', ' .$col[6]. ', ' .$col[7];//. ', ' .$col[8]. ', ' .$col[9]. ', ' .$col[10]; $myArray = explode(',', $matchen); if ($col[0] === $reeks) { echo "<tr>"; $row++; foreach($myArray as $key) { echo "<td>". trim($key)."</td>"; } echo "</tr>"; } } } } } fclose($handle); } echo "<br /><br />"; ?>
CSV文件部分内容
DIV;DATE;HOUR;HOME;AWAY;RH;RA;STATUS;MD;REGNUMBERHOME;REGNUMBERAWAY W2B;03/09/2022;18:00;VV Koekelare A;V.V. Tielt ;5;0;;1;02531;00218 W2B;03/09/2022;19:00;K. Dosko Beveren ;K. FC Lissewege A;1;0;;1;04334;04718 W2B;03/09/2022;19:00;Dosko Kanegem ;K. WS Houthulst A;0;0;;1;08832;02833 W2B;04/09/2022;15:00;SV Loppem ;K.S.K. Snaaskerke ;1;1;;1;06136;06435 W2B;04/09/2022;15:00;K.FC Lichtervelde ;K. SV Bredene ;1;3;;1;04320;04460 W2B;04/09/2022;15:00;Jong Male ;Club Roeselare ;4;0;;1;07951;09360 W2B;04/09/2022;15:00;K. VC Ardooie ;K. FC Heist A;2;0;;1;04257;04465 W2B;04/09/2022;15:00;SC Lombardsijde ;K. SKV Zwevezele ;2;2;;1;05187;06039 W2B;10/09/2022;18:30;K. SKV Zwevezele ;SV Loppem ;2;0;;2;06039;06136 W2B;10/09/2022;19:00;V.V. Tielt ;Jong Male ;2;3;;2;00218;07951 W2B;11/09/2022;15:00;K. SV Bredene ;K. Dosko Beveren ;2;2;;2;04460;04334 ...(剩余CSV内容省略)
测试可用ID为04334、系列为W2B的球队数据。
解决方案
核心问题排查
你的代码存在两个关键问题:
- CSV分隔符错误:实际用
;分隔列,但fgetcsv默认按,拆分,导致行数据结构混乱,客场ID无法被正确识别。 - 匹配逻辑冗余:
in_array可能匹配到非ID字段的相同值,且拆分后的数组结构导致客场ID的匹配失效。
修改后的完整代码
<?php $reeks = ""; $stamnr = "04334"; // 测试用球队ID,可根据需求动态获取 $row = 0; if (!empty($_POST['myselection'])) { $reeks = $_POST['myselection']; echo "<h3><b>REEKS " . $reeks . "</b></h3>"; if (($handle = fopen("test/masterfile.csv", "r")) !== FALSE) { // 跳过表头行 fgetcsv($handle, 1000, ";"); while (($col = fgetcsv($handle, 1000, ";")) !== FALSE) { $col = array_map("utf8_encode", $col); // 精准匹配主客场ID if ($col[9] === $stamnr || $col[10] === $stamnr) { // 筛选指定系列的赛事 if ($col[0] === $reeks) { // 处理日期和星期显示 $date = str_replace('/', '-', $col[1]); $dag = substr($date, 0, 2); $maand = substr($date, 3, 2); $jaar = substr($date, 6, 4); $weekdag = getWeekDay($dag, $maand, $jaar); $col[1] = $weekdag . "<br />" . $col[1]; // 输出赛事数据 echo "<tr>"; $row++; // 取前8列对应原代码需要展示的字段 foreach (array_slice($col, 0, 8) as $key) { echo "<td>" . trim($key) . "</td>"; } echo "</tr>"; } } } fclose($handle); } echo "<br /><br />"; } // 星期转换函数(确保存在) function getWeekDay($day, $month, $year) { $timestamp = mktime(0, 0, 0, $month, $day, $year); return date('l', $timestamp); // 返回英文星期,如需中文可修改为date('N')后映射中文 } ?>
关键修改点说明
- 修正CSV读取逻辑:
fgetcsv直接用;作为分隔符,无需再手动拆分,确保每行的11列数据被正确解析。 - 精准匹配ID:直接判断第9列(主场ID)或第10列(客场ID)是否等于目标
$stamnr,避免误匹配,同时确保主客场赛事都能被捕获。 - 优化循环逻辑:去掉多余的列循环,直接处理整行数据,代码更简洁高效。
- 跳过表头:避免表头行被当作赛事数据处理。
内容的提问来源于stack exchange,提问作者LUC TERMOTE
相关产品推荐
相关产品推荐

