массивы — разбить объединенную строку из текстового файла с новой строкой, переполнение стека

Я пытаюсь сделать стол состоящим из какого-нибудь кинотеатра от A [1-20] до J [1-20]. У меня есть текстовый файл, который содержит места, которые зарезервированы, как это:

A2;
A1;
A3;
A7;

если место зарезервировано, цвет таблицы должен быть красным. Это полный код:

<?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». Но когда я изменяю текстовый файл на это:

A2;A1;A3;A7;

ЕСЛИ может поймать их всех. Это неправильно объединять строки, как это? $seat.= fgets($file);, Что я могу сделать, чтобы он работал с первым TXT-файлом? Извините за мой плохой английский.

1

Решение

Я думаю, что-то вроде этого должно работать для вас. Я немного все упростил.

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
3

Другие решения

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

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

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

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

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

0

По вопросам рекламы [email protected]