Php 在特定索引上拆分大数组()
我在我的网站上有一个表单供用户发布结果报告, 报告如下所示:Php 在特定索引上拆分大数组(),php,Php,我在我的网站上有一个表单供用户发布结果报告, 报告如下所示: 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:
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
该报告每次都将是相同的,只是有一些小改动
我已经用explode将其拆分为一个数组
$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 />";
如果我可以删除索引的0-19,或者只是将数组拆分为一个新数组$records1,那么这段代码在这种情况下仍然有效
P.S报告中的这一部分一直在变化,可以说,该报告来自一个在线锦标赛托管工具,每个锦标赛没有固定数量的玩家,其数量可以从8人以上不等
我不确定我是否理解您需要什么。也许是这样的
其思想是在数组中搜索包含点的开始和结束的索引,并执行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 ];
}
$start=array\u搜索(“起点”,$records);
$end=数组搜索(“端点”、$records);
$playerArray=[];
对于($i=$start+1;$i<$end;$i++){
$parts=explode(“,$records[$i]);
$player=$parts[0];
$points=$parts[1];
$playerArray=[“玩家”=>$player,“点数”=>$points];
}
多亏了@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(,)查找数组索引的所需部分,
//即,在数组中,第2行的$records是日期,实际需要的信息是日期dd/mm/yyyy,
//所以我们使用$date=substr($records[2],7,10);
//从这个字符串:日期:2017年1月18日,这是记录中的第2行,我们得到2017年1月18日
// 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 />";
}
//获取日期
$date=substr($records[2],7,10);
回声“比赛日期:”$日期。“
”;
//获得明星时间
$start_time=substr($records[4],18,7);
回声“比赛开始时间:”$开始时间。“
”;
//获取主机名
$host=substr($records[7],7);
回声“锦标赛主持人:”$主办“
”;
//获得玩家数量
$number_of_players=substr($records[8],20);
echo“玩家数量:”$玩家的数量。“
”;
回声“
”;
//获取第一个地名和电子邮件地址
$fplaceName=substr($records[10],12);
回声“第一名:”$fplaceName。“
”;
$fplacemail=substr($records[11],18);
回显“第一名电子邮件:”$请发电子邮件。“
”;
//获得第二名和电子邮件
$splaceName=substr($records[12],12);
回音“第二位电子邮件:”$斜体字名称。“
”;
$splaceEmail=substr($records[13],18);
回音“第二位电子邮件:”$splaceEmail。“
”;
//获取第三名和电子邮件
$tplaceName=substr($records[14],12);
回音“第三位电子邮件:”$tplaceName。“
”;
$tplacemail=substr($records[15],18);
$t1placeEmail=”fake@fake.com";
如果($tplacemail==“”){//如果第三位电子邮件为空,请添加一封普通的假电子邮件,否则继续正常运行
$tplacemail=$t1placeEmail;
} ;
回音“第三位电子邮件:”$tplace电子邮件。“
”;
回声“
”;
//获得球员和分数。
$parts1=数组×片($records,20,-1);
$end=array\u pop($parts1);
$records=数组映射('htmlspecialchars',$records);
$records=数组映射($trim',$records);
foreach($parts1作为$record){
$lastSpace=strrpos($record',);
$player=trim(substr($record,0,$lastSpace));
$points=trim(substr($record,$lastSpace+1));
回声$player.“.”$points.“
”;
}
所以发生的是,一些用户在我原来的帖子中粘贴了上面的报告,
点击提交,
表单发布到my processing.php页面,
我将整个post“string”分解成一个数组$records,
数组\映射htmlspecialchars并修剪记录,
然后是提取日期、时间、主持人、玩家数量的所有代码,
然后我们得到第一、第二、第三个名字和电子邮件地址,
然后我们对玩家的名字和点数进行排序,
停止点索引[20]后面的行的数组_切片也为-1表示停止点索引,
弹出数组“停止点”中的最后一行,
在新阵列上重新进行阵列映射,
使用lastSpace strpos“”和新阵列在新阵列上运行foreach循环
然后从点数中分割玩家名称
如果我在我的原始帖子中给出的报告上运行完成的代码,您将得到以下输出:
音乐咖啡馆比赛日期:2017年1月22日比赛开始时间:下午1:00
比赛主持人:服务员()参赛人数:15人
第一名:poppop第一名电子邮件:bobmitch1170@gmail.com第二名
电邮:中士第二名电邮:rgarvey5@hotmail.com第三名电子邮件:
诉讼费第三名电子邮件:dostrow2008@gmail.com
burnieboy 5
欧盟委员会主席1 5
EU_IT_VIANG 5
GennaLee 5
快乐之旅5
麦维琪5
水星5号
MRC_学员5
傻瓜5
UBG_Angel_D_8 5
乌卜加乌卫星5号
诉讼律师60
幻影面具60
中士90
波普120
当然,规则将每个名字和分数分开,
这正是我所需要的,现在我可以添加我所有的sql语句和宾果。
如果有人能找到一种更简单或更好的方法来实现这一目标,我希望看到您的编辑并对其进行测试我不确定我的代码到您的代码中是如何实现的,但它几乎对我有效,在将代码添加到我的底部之后,我确实打印了零件,并在新数组中获得了1条记录,如果你回头看我上面的帖子,新数组中唯一的记录就是停止点前的一行。打印的输出是:数组([0]=>poppop[1]=>120)但是,我看不出为什么代码跳过了报告中所有其他行的逻辑
// 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 />";
}