Обработка двух многомерных массивов и пропуск массивов, которые имеют значение в конечном выводе - PullRequest
0 голосов
/ 16 мая 2018

Я работаю с двумя (2) массивами, динамически создаваемыми из данных MySQL.Один массив содержит все таблицы, доступные для бронирования.Вторая таблица содержит информацию о таблицах, забронированных на указанное время.Вещи выглядят так:

 <?php

    $all_tables = array(
                     0 => array('table_no' => '102', 'size' => '200sqm', 'color' => 'red', 'shape' => 'round', 'dept' => 'legal'),
                     1 => array('table_no' => '123', 'size' => '220sqm', 'color' => 'grey', 'shape' => 'square', 'dept' => 'Sales'),
                     2 => array('table_no' => '133', 'size' => '200sqm', 'color' => 'black', 'shape' => 'square', 'dept' => 'Accounts'),
                     3 => array('table_no' => '168', 'size' => '280sqm', 'color' => 'blue', 'shape' => 'round', 'dept' => 'legal'),
                     4 => array('table_no' => '714', 'size' => '200sqm', 'color' => 'black', 'shape' => 'round', 'dept' => 'Marketing')
                   );
 $booked_tables = array(
                     0 => array('booking_no' => '1', 'table_no' => '123', 'date_booked' => '01-05-18'),
                     1 => array('booking_no' => '2', 'table_no' => '168', 'date_booked' => '03-05-18')
                   );
        ?>

Что я хочу сделать:

Основной массив - массив $ all_tables.Я хочу исключить все массивы из массива $ all_tables, table_no которого соответствует номеру таблицы массива в таблице $ booked_array.В вышеприведенном примере результирующие массивы после обработки этих массивов будут:

$available_tables = array(
                     0 => array('table_no' => '102', 'size' => '200sqm', 'color' => 'red', 'shape' => 'round', 'dept' => 'legal'),
                     1 => array('table_no' => '133', 'size' => '200sqm', 'color' => 'black', 'shape' => 'square', 'dept' => 'Accounts'),
                     2 => array('table_no' => '714', 'size' => '200sqm', 'color' => 'black', 'shape' => 'round', 'dept' => 'Marketing')
                   );

Если возможно, я был бы рад создать многомерный массив, содержащий удаленные массивы.Но это нормально, если они будут удалены.

То, что я пробовал:

foreach($all_rooms as $rooms) {
    foreach($booked_rooms as $booked) {
        $booked['table_no'];
    }

 if (( $booked['table_no']) == ($rooms['table_no'])) {
   //remove some array or identify some array
 } 

}

К сожалению, я не смог пройти мимо не очень хорошего начала.Я думаю, что две петли могли бы добиться цели.Или, может быть, это требует пользовательских функций или ни того, ни другого.Во всяком случае, мои мозговые клетки не могут выработать логику.

Вопрос:

Как мне достичь желаемого результата выше?Есть предложения, советы?Это вообще возможно?Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Я бы посоветовал сделать еще шаг назад.Если вы измените способ извлечения результатов из своего запроса, вы можете сделать это сравнение (и, возможно, другие вещи) немного проще в обработке.

Попробуйте использовать table_no в качестве ключа при извлечениистроки из вашего запроса.Примерно так:

while ($table = $table_query->fetch()) {
    $all_tables[$table['table_no']] = $table;
}

while ($booking = $bookings_query->fetch()) {
    $booked_tables[$booking['table_no']][] = $booking;
}

Таким образом, массив $all_tables будет проиндексирован как table_no.

$all_tables = array(
    102 => array('table_no' => '102', 'size' => '200sqm', 'color' => 'red', 'shape' => 'round', 'dept' => 'legal'),
    123 => array('table_no' => '123', 'size' => '220sqm', 'color' => 'grey', 'shape' => 'square', 'dept' => 'Sales'),
    133 => array('table_no' => '133', 'size' => '200sqm', 'color' => 'black', 'shape' => 'square', 'dept' => 'Accounts'),
    168 => array('table_no' => '168', 'size' => '280sqm', 'color' => 'blue', 'shape' => 'round', 'dept' => 'legal'),
    714 => array('table_no' => '714', 'size' => '200sqm', 'color' => 'black', 'shape' => 'round', 'dept' => 'Marketing')
);

, а $booked_tables будет массивом наборовбронирования, связанные с каждым table_no.

$booked_tables = array(
    123 => [array('booking_no' => '1', 'table_no' => '123', 'date_booked' => '01-05-18')],
    168 => [array('booking_no' => '2', 'table_no' => '168', 'date_booked' => '03-05-18')]
);

Я предложил эту структуру, потому что я предполагаю, что table_no уникален в $all_tables, но не обязательно в $booked_tables.

Таким образом, чтобы получить доступные таблицы, вы можете просто использовать array_diff_key.

$available_tables = array_diff_key($all_tables, $booked_tables);

или для оставшегося набора array_intersect_key.

$not_available_tables = array_intersect_key($all_tables, $booked_tables);
0 голосов
/ 16 мая 2018

Чистый путь без foreach

<?php

$all_tables = array(
    0 => array('table_no' => '102', 'size' => '200sqm', 'color' => 'red', 'shape' => 'round', 'dept' => 'legal'),
    1 => array('table_no' => '123', 'size' => '220sqm', 'color' => 'grey', 'shape' => 'square', 'dept' => 'Sales'),
    2 => array('table_no' => '133', 'size' => '200sqm', 'color' => 'black', 'shape' => 'square', 'dept' => 'Accounts'),
    3 => array('table_no' => '168', 'size' => '280sqm', 'color' => 'blue', 'shape' => 'round', 'dept' => 'legal'),
    4 => array('table_no' => '714', 'size' => '200sqm', 'color' => 'black', 'shape' => 'round', 'dept' => 'Marketing')
);
$booked_tables = array(
    0 => array('booking_no' => '1', 'table_no' => '123', 'date_booked' => '01-05-18'),
    1 => array('booking_no' => '2', 'table_no' => '168', 'date_booked' => '03-05-18')
);

//extract all numbers in an array like ['123', '168', ...]
$booked_tables_numbers = array_column($booked_tables, 'table_no');

//remove if booked
$available_tables= array_filter($all_tables, function($array) use($booked_tables_numbers) {
    return !in_array($array['table_no'], $booked_tables_numbers);
});
...