Php 处理两个多维数组并跳过在最终输出中共享一个值的数组

Php 处理两个多维数组并跳过在最终输出中共享一个值的数组,php,arrays,loops,recursion,foreach,Php,Arrays,Loops,Recursion,Foreach,我正在使用从MySQL数据动态创建的两(2)个数组。一个数组包含所有可预订的表。第二个表保存有关在指定时间预订的表的信息。情况如下: <?php $all_tables = array( 0 => array('table_no' => '102', 'size' => '200sqm', 'color' => 'red', 'shape' => 'round', 'dept' => 'legal')

我正在使用从MySQL数据动态创建的两(2)个数组。一个数组包含所有可预订的表。第二个表保存有关在指定时间预订的表的信息。情况如下:

 <?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')
                   );
        ?>
如果可能的话,我很高兴能够创建一个包含已删除数组的多维数组。但是如果把它们去掉就可以了

我所尝试的:

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
 } 

}
可悲的是,我无法超越这个不太好的开端。我想两个循环就可以了。或者它需要一个自定义函数,或者两者都不需要。不管怎么说,我的脑细胞无法理解逻辑

问题:


我如何实现上述预期结果?有什么建议、提示吗?这可能吗?请帮助。

一种干净的方式,无需使用
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);
});

我建议再往后退一步。如果修改从查询中获取结果的方式,则可以使这种比较(可能还有其他事情)更容易处理

从查询中获取行时,请尝试使用
表\u no
作为键。大概是这样的:

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

while ($booking = $bookings_query->fetch()) {
    $booked_tables[$booking['table_no']][] = $booking;
}
这样,
$all\u tables
数组将被
table\u 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 = 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')]
);
$booked\u tables
将是一组与每个
table\u 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 = 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')]
);
我提出这种结构是因为我假设
表\u no
$all\u tables
中是唯一的,但在
$booked\u tables
中不一定是唯一的

这样,要获得可用的表,只需使用
array\u diff\u key

$available_tables = array_diff_key($all_tables, $booked_tables);
$not_available_tables = array_intersect_key($all_tables, $booked_tables);
或者对于剩余的集合,
array\u intersect\u key

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

哇,这真是太干净了。它也更容易理解。那些家伙把我勒死了。这不仅解决了问题,还使我能够解决与多维数组相关的其他问题。我将它插入MySQL的实际数据中,一切正常。用户选择一个时间段,在此期间他们想要预订一个表。此时没有选择表,因此没有表。一个查询用于所有表,另一个查询用于预订表。其思想是在从另一个MySQL表返回所有表的同时,查找用户想要预订表的时间段内预订的所有表。这就是为什么我想要一种从all tables数组中删除Booked tables数组中出现的表的方法。一旦预订了一个表,MySQL的“预订表”将由表所有者手动更新。你的建议很好,我只需要修改我的逻辑。