2015-04-06 73 views
1

我試圖製作一個表包含某種類型的電影院從A [1-20]到J [1-20]。我有一個包含被保留席位,這樣的txt文件:爆炸從文本文件連接字符串與新行,PHP

A2; 
A1; 
A3; 
A7; 

如果座位預留,表的BGCOLOR必須爲紅色。這是全碼:

<?php 
$file = fopen($path,"r") or exit("cant open file"); 
$seat=""; 
while(!feof($file)) 
{ 
    $seat.= fgets($file); 
} 
$seat_splitted = explode(";",$seat); 
fclose($file); 

$arrTable[]=""; 
$letter=""; 
$tableContent=""; 

for($i = 0,$counter=0;$i<10;$i++,$counter++) 
{ 
    if($i==0) 
     $letter="A"; 
    else if($i==1) 
     $letter="B"; 
    else if($i==2) 
     $letter="C"; 
    else if($i==3) 
     $letter="D"; 
    else if($i==4) 
     $letter="E"; 
    else if($i==5) 
     $letter="F"; 
    else if($i==6) 
     $letter="G"; 
    else if($i==7) 
     $letter="H"; 
    else if($i==8) 
     $letter="I"; 
    else if($i==9) 
     $letter="J"; 
?> 
    <tr> 
<?php 
    for($j = 1;$j<21;$j++) 
    { 
     $arrTable[$counter]= $letter.$j; 
     foreach($seat_splitted as $value) 
     { 
      if(strcmp($value,$arrTable[$counter])==0) 
      //if($value == $letter.$j) 
      { 
       $GLOBALS['color']="red"; 
       break; 
      } 
      else 
       $GLOBALS['color']="white"; 
     } 
     ?> 
     <td bgcolor="<?php echo $GLOBALS['color']; ?>"> <?php echo $arrTable[$counter]?> </td> 
    <?php 
     $counter++; 
    } 
    ?> 
    </tr> 
<?php 
} 
?> 

我不知道爲什麼,當if(strcmp($value,$arrTable[$counter])==0)//if($value == $letter.$j),其只趕上第一座是「A2」。但是,當我將txt文件更改爲:

A2;A1;A3;A7; 

IF可以捕獲它們。像這樣連接字符串是錯誤的嗎? $seat.= fgets($file);。我能做些什麼來使它與第一個txt文件一起工作?對不起,我的英語不好。

+0

請包括您的當前輸出和您的預期輸出! – Rizier123 2015-04-06 10:57:57

+1

'''''''seat_splitted = file($ path,FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)或退出(「無法打開文件」);如果它太大隻是一個小例子,所以我們看到你想要什麼, array_walk($ seats_splitted,function($ seat){$ seat = trim(seat,';');});' – 2015-04-06 11:08:39

+0

供參考:您可以接受答案最能幫助您並解決您的問題(http:// meta .stackexchange.com/q/5234)! – Rizier123 2015-04-06 12:23:18

回答

3

我認爲這樣的事情應該適合你。我簡化了一切。

1.首先,我創建一個包含所有席位的數組($seats)。它有這樣的結構:

Array 
(
    [A] => Array 
     (
      [1] => free 
      [2] => free 
      [3] => free 
      //... 
    //... 

2.在此之後,我將所有保留的座位從文件中獲取到數組中。 (一個更好的解決辦法是,如果你在一個數據庫中所有數據!)

3.然後我遍歷每個指定席,也將其設置爲使$seats陣列方式,因此它得到這樣的:

Array 
(
    [A] => Array 
     (
      [1] => reserved 
      [2] => free 
      [3] => reserved 
      //... 
    //... 

4.在端予簡單地打印表

代碼:

<?php 

    //create seats 
    $rows = range(strtoupper("A"), strtoupper("J")); 
    $columns = range(1, 20); 

    $seats = array_combine($rows, array_map(function($v)use($columns){ 
     return array_combine($columns, array_fill(0, count($columns), "free")); 
    }, $rows)); 

    //get reserved seats 
    $reservedSeats = array_map(function($v){ 
     return trim($v, ";"); 
    }, file("test.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)); 

    //set reserved seats 
    foreach($reservedSeats as $reserved) { 
     $checkOne = preg_replace("/[^A-Z]*/", "", $reserved); 
     $checkTwo = preg_replace("/[^0-9]*/", "", $reserved); 

     if(isset($seats[$checkOne]) && isset($seats[$checkOne][$checkTwo])) 
      $seats[$checkOne][$checkTwo] = "reserved";  
    } 

    //print seats 
    $reservedColor = "red"; 
    $defaultColor = "white"; 
    $rowColor = "green"; 

    echo "<table border='1'>"; 
    foreach($seats as $row) { 
     echo "<tr><td bgcolor='" . $rowColor . "'>" . $rowKey . "</td>"; 
     foreach($row as $key => $seat) 
      echo "<td bgcolor='" . ($seat == "reserved"?$reservedColor:$defaultColor) . "'>" . $key . "</td>"; 
     echo "</tr>"; 
    } 
    echo "</table>"; 

?> 

輸出(無顏色):

A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
B 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
D 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
E 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
F 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
G 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
H 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
J 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
+0

哦,我的天啊,以前我不知道有這麼多的陣列功能。我是新來的PHP。謝謝這麼多,這真的很有啓發! :) – 2015-04-06 13:35:58

+0

@FirmansyahRamadhan不客氣!享受你的一天:D – Rizier123 2015-04-06 13:37:36

0

如果使用explode爲你做什麼,你會得到一個數組:

["A2","\nB1","\nC3"...] 

所以,你必須處理\n

也許你可以試試爲explode(";\n",$seat)

更新:在某些系統中,您需要使用\ r \ n。所以這裏是正確的最終解決方案:explode(";\r\n",$seat)

+1

供參考:也可能是'\ r \ n'。 – h2ooooooo 2015-04-06 11:08:38

+0

哇,它與'\ r \ n'一起工作,但不能捕獲最後一個座位「A7」 – 2015-04-06 11:10:16

+0

@FirmansyahRamadhan如果您在輸入數據的末尾添加新行,您會發現它的工作原理。 – Turtle 2015-04-06 11:19:56