简体   繁体   中英

Explode concatenate string from text file with new line, PHP

Im trying to make a table consist some sort of cinema seat from A[1-20] to J[1-20]. I have a txt file which contain seats that are reserved, like this:

A2;
A1;
A3;
A7;

if a seat is reserved, the bgcolor of table must be red. This is the full code:

<?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
}
?>

I dont know why when if(strcmp($value,$arrTable[$counter])==0) or //if($value == $letter.$j) , its only catch the first seat which is "A2". But when i change the txt file to this:

A2;A1;A3;A7;

the IF can catch them all. Is it wrong to concatenate string like this? $seat.= fgets($file); . What can i do to make it work with the first txt file? Sorry for my bad english.

I think something like this should work for you. I simplified everything a bit.

1. First I create an array ( $seats ) with all seats in it. Which has a structure like this:

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

2. After this I get all reserved seats from the file into an array. (A better solution would be if you have all this data in a database!)

3. Then I loop through each reserved seat and also set it to that in the $seats array, so that it gets something like this:

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

4. At the end I simply print the table

Code:

<?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>";

?>

output (without colors):

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

IF you use the explode as you do, you will get an array of:

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

So you have to deal with the \\n

Maybe you could have a try as explode(";\\n",$seat)

Update : in some system u need to use \\r\\n. So here is the correct final solution: explode(";\\r\\n",$seat)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM