我的网站上有一个表单供用户发布结果报告, 报告看起来像这样:
Nojoks's Tourney Bracket Tool Version 1.2.1.84
Tournament: 3/5 Backgammon 1:00pm
Date: 01/22/2017
Day: Sunday
Scheduled Start: 1.00pm PST
Actual Start: 20:00:30
Closed: 20:11:00
Host: Waiter ()
Number of Players: 15
1st place: poppop
1st place email: bobmitch1170@gmail.com
2nd place: Sarge
2nd place email: rgarvey5@hotmail.com
3rd place: Litigolfer
3rd place email: dostrow2008@gmail.com
3rd place: PhantomMask
3rd place email:
START POINTS
burnieboy 5
EU_BNL_Chris1 5
EU_IT_VIANG 5
GennaLee 5
happybear 5
MC_Vicky 5
merceaviles 5
MRC_cadet 5
poeticfool 5
UBG_Angel_D_8 5
UBG_sara1smoon 5
Litigolfer 60
PhantomMask 60
Sarge 90
poppop 120
STOP POINTS
这个报告每次都会有一些相同的细微变化 我已经把它拆分成一个爆炸的数组
$records = explode( PHP_EOL, $_POST['points'] );
$records = array_map('htmlspecialchars', $records );
$records = array_map ('trim', $records);
然后我开始从报告的顶部收集信息,如下所示:
// Get Date
$date = substr($records[2], 7, 10);
echo "<b>Tournament Date: </b>" . $date . "<br />";
// Get star time
$start_time = substr($records[4], 18, 7);
echo "<b>Tournament Start Time: </b>" . $start_time . "<br />";
现在我需要处理来自$ records [20]的所有内容 我需要做的很简单,我只是不知道如何首先到达我的数组的正确部分 我曾经要求我的用户只将START POINTS行中的信息发布到STOP POINTS,以便获取我的信息并且拆分很简单我使用过:
foreach( $records as $record ) {
$lastSpace = strrpos( $record, ' ' );
$player = trim( substr( $record, 0, $lastSpace ) );
$points = trim( substr( $record, $lastSpace+1 ) );
如果我可以删除索引的0 - 19或者只是将数组拆分成一个新的数组$ record1,那么此代码仍将在这种情况下工作 P.S它在报告中的这一部分一直在变化,所以说这个报告来自一个在线锦标赛托管工具,每个锦标赛没有一定数量的玩家,它可以从8个向上
答案 0 :(得分:0)
我不确定我理解你需要什么。也许是这样的?
我们的想法是搜索数组中包含点的起点和终点的索引,并执行for循环以仅迭代这些点。
$start = array_search("START POINTS", $records);
$end = array_search("END POINTS", $records);
$playerArray = [];
for ($i = $start+1;$i < $end;$i++) {
$parts = explode(" ",$records[$i]);
$player = $parts[0];
$points = $parts[1];
$playerArray = [ "player" => $player, "points" => $points ];
}
答案 1 :(得分:0)
我设法自己解决这个问题,感谢@apokryfos你的代码仍然没有做我想要的安静,所以我使用你的代码并将它们添加到我现在拥有的, 这就是我想出的:
// New try to split a full report in one go.
$points = $date = $day = $start_time = $host = $number_of_players = $fp_name = $fp_email = $sp_name = $sp_email = "";
// Explode the string at the end of each line,
// array map and remove any special chars then trim white space.
$records = explode( PHP_EOL, $_POST['points'] );
$records = array_map('htmlspecialchars', $records );
$records = array_map ('trim', $records);
//现在NJ报告的每一行都在一个数组中,调用数组$ records [索引号] //使用substr(,,)来查找数组索引所需的部分, //数组中的I.E第2行的$记录是日期,实际需要的信息是日期dd / mm / yyyy, //所以我们使用$ date = substr($ records [2],7,10); //来自这个字符串:日期:01/18/2017这是记录中的第2行,我们得到01/18/2017
// Get Date
$date = substr($records[2], 7, 10);
echo "<b>Tournament Date: </b>" . $date . "<br />";
// Get star time
$start_time = substr($records[4], 18, 7);
echo "<b>Tournament Start Time: </b>" . $start_time . "<br />";
// get Host name
$host = substr($records[7], 7);
echo "<b>Tournament Host: </b>" . $host . "<br />";
// get number of players
$number_of_players = substr($records[8], 20);
echo "<b> Number Of Players: </b>" . $number_of_players . "<br />";
echo "<br />";
// get the first place name and email address
$fplaceName = substr($records[10], 12);
echo "<b>1ST place: </b>" . $fplaceName . "<br />";
$fplaceEmail = substr($records[11], 18);
echo "<b>1ST place Email: </b>" . $fplaceEmail . "<br />";
// Get second place name and email
$splaceName = substr($records[12], 12);
echo "<b>2ND place Email: </b>" . $splaceName . "<br />";
$splaceEmail = substr($records[13], 18);
echo "<b>2ND place Email: </b>" . $splaceEmail . "<br />";
// get third place name and email
$tplaceName = substr($records[14], 12);
echo "<b>3RD place Email: </b>" . $tplaceName . "<br />";
$tplaceEmail = substr($records[15], 18);
$t1placeEmail = "fake@fake.com";
if($tplaceEmail == "") { // if third place email is empty add a generic fake email else continue as normal
$tplaceEmail = $t1placeEmail;
} ;
echo "<b>3RD place Email: </b>" . $tplaceEmail . "<br />";
echo "<hr /><br /><br />";
// Getting the players and points.
$parts1 = array_slice($records, 20, -1);
$end = array_pop($parts1);
$records = array_map('htmlspecialchars', $records );
$records = array_map ('trim', $records);
foreach( $parts1 as $record ) {
$lastSpace = strrpos( $record, ' ' );
$player = trim( substr( $record, 0, $lastSpace ) );
$points = trim( substr( $record, $lastSpace+1 ) );
echo $player . " " . " " . " " . $points . "<hr /><br />";
}
所以会发生什么,有些用户在我原来的帖子中粘贴上面的报告, 并点击提交, 表单发布到我的processing.php页面, 我将整个帖子“string”分解成数组$ records, array_map htmlspecialchars并修剪记录, 然后有所有代码提取日期,时间,主持人,玩家数量, 然后我们得到第1,第2,第3个名字和电子邮件地址, 然后我们对玩家名和点进行排序, 来自STOP POINTS索引[20]之后的行的array_slice也为-1,表示STOP POINTS索引, 弹出数组“STOP POINTS”的最后一行, 在新数组上执行array_map, 使用lastSpace strpos“”和新数组在新数组上运行foreach循环 然后从点分割玩家名称....
如果我在原始帖子中给出的报告上运行完成的代码,则会得到以下输出:
Music Cafe锦标赛日期:2017年1月22日锦标赛开始时间:下午1点 比赛主持人:服务员()球员数量:15
第一名:poppop第一名发送电子邮件:bobmitch1170@gmail.com第二名 电邮:Sarge 2ND地址电邮:rgarvey5@hotmail.com 3RD地点电邮: Litigolfer 3RD地点电子邮件:dostrow2008@gmail.com
burnieboy 5
EU_BNL_Chris1 5
EU_IT_VIANG 5
GennaLee 5
happybear 5
MC_Vicky 5
merceaviles 5
MRC_cadet 5
poeticfool 5
UBG_Angel_D_8 5
UBG_sara1smoon 5
Litigolfer 60
PhantomMask 60
Sarge 90
poppop 120
当然,规则将每个名称和点分开, 这是我需要的,现在我可以添加所有的sql语句和宾果游戏。 如果有人能够看到更简单或更好的方法来实现这一目标,我很乐意看到你的编辑并测试它们