2015-04-06 76 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