在特定索引上拆分大型数组()

时间:2017-01-23 15:55:02

标签: 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:  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个向上

2 个答案:

答案 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语句和宾果游戏。 如果有人能够看到更简单或更好的方法来实现这一目标,我很乐意看到你的编辑并测试它们