1 Вопрос: PHP - Поиск последовательных значений в многомерных ассоциативных массивах для программы бронирования мест

вопрос создан в Thu, May 2, 2019 12:00 AM

Я работаю над программой резервирования мест для шоу. У меня есть многомерный массив, который создается с помощью переменных $row и $column. После нескольких первоначальных резервирований мне нужно передать целые числа в функцию /некоторый код, чтобы сделать дальнейшее резервирование.

Я попытался перебрать массив, чтобы найти последовательные доступные места (значение «толку»), но он игнорирует зарезервированные места или пропускает их. Позже мне нужно будет использовать расстояние до Манхэттена, чтобы сначала зарезервировать лучшие места (из ряда 1, места 6).

функция для создания массива:

//function to create seating chart data structure
function createChart($row, $column){
    //create array for row values
    $row_chart = array();
    for($r=0; $r < $row; $r++){
        $row_number = $r + 1;
        $row_chart[$row_number] = array(); // array of cells for row $r
    }
    //create array for column values
    $column_chart = array();
        for($c=0; $c < $column; $c++){
            $column_number = $c + 1;
            //$location = $c_num;
            $status = "avail";
            foreach($row_chart as $key => $value){
                $column_chart[$column_number] = $status; //add arrays of "seats" for each row
            }
        }

    //nest the column array into the row array
    foreach($row_chart as $key => $value){
        foreach($column_chart as $k => $v){
            $seating_chart[$key][$k] = $status; 
        }
    }
    //$seating_chart = array_combine($row_chart, $column_chart);
    return $seating_chart;
}

функция для первоначального бронирования:

    $initial_reservation = "R1C4 R1C6 R2C3 R2C7 R3C9 R3C10";
    $initial_reservation = explode(" ", $initial_reservation);
    echo "<br> <br>";
    print_r($initial_reservation);
    $initial_res_length = count($initial_reservation);
    echo "<br> <br>";
    //echo $initial_res_length;

    //split each seat up into integers to mark it reserved in the array
//issue for flexibility: find way to break up string by letters and numbers for larger charts
    for($a = 0; $a < $initial_res_length; $a++){
        $reso_row = substr($initial_reservation[$a], 1, 1);
        //echo $reso_row . "<br>";    
        $reso_column = substr($initial_reservation[$a], 3, 2);
        //echo $reso_column . "<br>";
        $working_chart[$reso_row][$reso_column] = "reserved";
    }

    //echo "<br> <br>";
    //echo "<pre>" . print_r($working_chart, 1) . "</pre>";

то, что я имею до сих пор в попытке сделать дальнейшие оговорки:

//write some code to find consecutive seats
    $seats_needed = 4;
    $outer_array_length = count($working_chart);
    //echo $outer_array_length;

    for($d = 1; $d < $outer_array_length + 1; $d++){
        for($e = 1; $e < $seats_needed + 1; $e++){
            //issue: run through $seats_needed amount of times and executes the code block
            //needed: check if $seats_needed amount of seats in available first then run reservation code
                if($working_chart[$d][$e] === "avail"){
                    $working_chart[$d][$e] = "new reservation";  
                }
                else{
                    echo "Sorry, not possible.";
                }

        }
        break;
    }

    echo "<br> <br>";
    echo "<pre>" . print_r($working_chart, 1) . "</pre>";

Я бы хотел сначала найти несколько доступных мест ($seat_needed), а затем просмотреть их.

    
1
  1. ваша функция createChart ($row, $column) возвращает точно так же, как array_fill(1, $row, array_fill(1, $column, "avail"))
    2019-05-02 15: 54: 39Z
  2. Также спасибо за это, я думал о том, смогу ли я сделать это следующим образом.
    2019-05-02 22: 15: 31Z
1 ответ                              1                         

Я инициализировал $working_chart с помощью:

$working_chart =  createChart(10, 11);

Я написал попытку сделать дальнейшее бронирование:

foreach(array_keys($working_chart) as $d ){
    $maxColumn = count($working_chart[$d]) - $seats_needed + 1;
    for($e = 1; $e <= $maxColumn ; $e++){
        if(["avail"] === array_unique(array_slice($working_chart[$d], $e - 1 , $seats_needed))){
            $working_chart[$d] = array_replace($working_chart[$d], array_fill($e, $seats_needed, "new reservation"));
            break 2;
        }
        else{
            echo "Sorry, not possible.";
        }
    }
}

Надеюсь, это поможет вам ...

    
1
2019-05-02 16: 30: 03Z
  1. Спасибо! Это помогло.
    2019-05-02 22: 14: 51Z
источник размещен Вот