2015-04-06 3 views
1

Im пытается сделать таблицу состоящей из какого-то кинотеатра с A [1-20] до J [1-20]. У меня есть текстовый файл, который содержит место, зарезервированные, как это:Explode concatenate string из текстового файла с новой строкой, 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

+1

'$ seat_splitted = file ($ path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) или выйти (« can not open file »); array_walk ($ seat_splitted, function ($ seat) {$ seat = trim (seat, ';');}); ' –

+0

FYI: вы можете принять ответ, который помог вам больше всего и решить вашу проблему (http: // meta .stackexchange.com/q/5234)! – Rizier123

ответ

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. Большое спасибо, это действительно поучительно! :) –

+0

@FirmansyahRamadhan Добро пожаловать! Наслаждайтесь своим днем: D – Rizier123

0

Если вы используете explode, как вы это сделаете, вы получите массив:

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

Таким образом, вы должны иметь дело с \n

Может быть, вы могли бы попробовать как explode(";\n",$seat)

Обновление: в некоторой системе вам необходимо использовать \ r \ n. Итак, вот верное окончательное решение: explode(";\r\n",$seat)

+1

FYI: Он также может быть '\ r \ n'. – h2ooooooo

+0

woah, он работает с '\ r \ n', но не может уловить последнее место «A7» –

+0

@FirmansyahRamadhan, если вы добавите новую строку в конце ваших входных данных, вы найдете ее работу. – Turtle

Смежные вопросы