PHP多维数组处理:如何过滤掉与已预订桌号重复的元素?
解决PHP数组过滤:分离可用与已预订桌子
嘿,我来帮你搞定这个问题!你的需求其实可以通过更简洁高效的方式实现,不用嵌套循环绕晕自己。核心思路是先把已预订的桌号提取成一个一维数组,这样后续判断的时候直接用快速查询方法,比嵌套循环清晰多了。
步骤分解
- 提取已预订桌号:从
$booked_tables中取出所有table_no值,生成一个一维数组,方便快速检查某个桌号是否已被预订。 - 遍历分类:循环
$all_tables,将每个桌子根据桌号是否在已预订数组中,分别放入可用桌子数组和被移除的已预订桌子数组。
完整实现代码
<?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') ); // 提取所有已预订的桌号到一维数组 $booked_table_nos = array_column($booked_tables, 'table_no'); // 初始化结果数组 $available_tables = []; $removed_tables = []; // 遍历所有桌子进行分类 foreach ($all_tables as $table) { if (in_array($table['table_no'], $booked_table_nos)) { // 桌号已被预订,放入移除数组 $removed_tables[] = $table; } else { // 桌号可用,放入可用数组 $available_tables[] = $table; } } // 验证结果 echo "可用桌子数组:\n"; print_r($available_tables); echo "\n被移除的已预订桌子数组:\n"; print_r($removed_tables); ?>
为什么你的嵌套循环没成功?
看你写的代码,有几个关键问题导致失败:
- 变量名不匹配:你用了
$all_rooms和$booked_rooms,但原始数组是$all_tables和$booked_tables,变量名错误会直接导致循环无法正确执行。 - 作用域问题:内层循环里的
$booked['table_no'],在循环结束后只会保留最后一个已预订桌号,无法和每个桌子逐一对比。 - 逻辑顺序错误:你在内层循环里只取了桌号,但没有做判断,等内层循环结束后再判断,只会拿最后一个已预订桌号和当前桌子对比,逻辑完全不对。
性能优化(可选)
如果你的数组数据量很大,推荐把$booked_table_nos转成键值对数组,用isset()判断会比in_array()更快(数组键查询是O(1)时间复杂度):
// 转成键为桌号的数组 $booked_table_keys = array_flip($booked_table_nos); // 判断逻辑修改为 if (isset($booked_table_keys[$table['table_no']])) { $removed_tables[] = $table; } else { $available_tables[] = $table; }
这样处理后,你就能同时得到符合需求的两个数组啦,逻辑清晰还高效。
内容的提问来源于stack exchange,提问作者Bululu
相关产品推荐
相关产品推荐

