2017-01-23 55 views
0

我有我的網站的形式爲用戶發佈結果報告到, 報告如下:分裂一個大陣列()在一個特定的指數

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: [email protected] 
2nd place: Sarge 
2nd place email: [email protected] 
3rd place: Litigolfer 
3rd place email: [email protected] 
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 />"; 

現在我需要的一切工作,從$記錄[20]下來 什麼,我需要做的是很簡單的,我只是不知道如何讓我的數組的正確部分第一 我常常問我的用戶張貼只能從起點線下來的信息,停止點位,到了讓我的信息和分割很簡單,我用:

foreach($records as $record) { 
    $lastSpace = strrpos($record, ' '); 
    $player = trim(substr($record, 0, $lastSpace)); 
    $points = trim(substr($record, $lastSpace+1)); 

此代碼將仍然在這種情況下工作,如果我可以刪除索引的0 - 19或者只是將數組拆分成一個新陣列$ records1 PS其報告中的此部分不斷變化,因此可以說這個報告來自於一個在線tournamen噸託管工具和每場比賽沒有設定數量的球員,它可以從8向上範圍

回答

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 ];   
} 
+0

我真的不知道如何從我的代碼到你的代碼,但它幾乎工作我,將代碼添加到我的底部後,我做了部分print_r,並在該新數組中獲得1條記錄,如果您引用回我的上述帖子,新數組中的唯一記錄就是STOP之前的行POINTS輸出from print_r is:Array([0] => poppop [1] => 120)但是我看不到邏輯代碼爲什麼跳過報表中的所有其他行。 –

+0

@MichaelBaxter我已經更新了一些代碼,它「跳過」數組的開始的原因是因爲它使用for循環和特定數組索引作爲邊界而不是整個數組。 – apokryfos

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); 

//現在新澤西州的報告的每一行是一個數組,調用數組$記錄[指數] //使用SUBSTR(,)找到的所需要的部分數組索引, //數組中的IE //第2行的$記錄是實際需要的信息是日期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 = "[email protected]"; 
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 />"; 
} 

所以會發生什麼時,一些用戶在我原來貼如上報告發帖, 並點擊提交, 表單發帖到我的處理。php頁面, 我把整個帖子「字符串」爆炸成一個數組$紀錄, array_map htmlspecialchars和trim記錄,然後有所有的代碼提取日期,時間,主機,玩家數量,然後我們得到第一,第二,第三名和電子郵件地址, 然後我們開始排序玩家名和點數,array_slice從STOP POINTS索引[20]之後的行也停留POINTS索引爲-1, 彈出最後一行陣列「STOP POINTS」不見了, 重新執行新陣列上的a​​rray_map, 使用lastSpace strpos「」和新陣列在新陣列上運行一個foreach循環,然後從點中分離玩家名稱....

如果我運行在原來的職位給出的報告中完成的代碼將得到以下的輸出:

音樂茶座比賽日期:2017年1月22日比賽開始時間:下午1點 錦標賽主持人:服務員( )號主力隊員:15

第一名:poppop第一名電子郵件:[email protected]第二名 電子郵件:Sarge的第二名電郵:[email protected]第三名電子郵件: Litigolfer第三名電子郵件: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語句和賓果。 請如果任何人都可以看到一個更容易或更好的方式來實現這一目標,我希望看到您的編輯和測試出