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 />"; 
}