在php中用对象过滤2个数组

Posted

技术标签:

【中文标题】在php中用对象过滤2个数组【英文标题】:Filter 2 arrays with object in php 【发布时间】:2019-10-14 01:12:54 【问题描述】:

我编写了一个酒店房间的预订系统。 我在数据库中有一张包含酒店(房间)所有房间的表。下一张桌子是预订。我需要编写一个函数,为我提供预订的日期、开始和结束时间,并且该函数将在给定的时间限制内将所有空闲房间归还给我。我不知道如何完全咬它。有人可以指导我吗?

我正在考虑获得所有房间,然后是所有预订,以及发货到活动日期,但接下来呢?怎么安排?

@编辑

房间表:

- id
- number

预订表:

- id
- room_id
- date
- time_start
- time_finish

【问题讨论】:

我认为您可以通过一个简单的连接 sql 查询来完成这一切。可以分享示例表数据吗? 我添加了表格结构 这在 SQL 而不是 php 函数中做得更好 【参考方案1】:

你可以这样做:

select rooms.* from rooms
left join reservations 
on rooms.id = reservations.room_id
and reservations.date = '2019-05-28' and reservations.time_start < '14:00' and reservations.time_finish > '14:00'
where reservations.id is null

如果测试架构是这样的:

SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

CREATE TABLE `reservations` (
  `id` int(11) NOT NULL,
  `room_id` int(11) NOT NULL,
  `date` date NOT NULL,
  `time_start` time NOT NULL,
  `time_finish` time NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `reservations` (`id`, `room_id`, `date`, `time_start`, `time_finish`) VALUES
(0, 2,  '2019-05-28',   '13:00:00', '16:00:00');

CREATE TABLE `rooms` (
  `id` int(11) NOT NULL,
  `name` varchar(15) NOT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `rooms` (`id`, `name`) VALUES
(1, 'room1'),
(2, 'room2');

小提琴示例:

http://sqlfiddle.com/#!9/f82a5c/1

【讨论】:

我为 CodeIgniter 语法重写了您的代码:$query = $this-&gt;db-&gt;join('reservations', 'rooms.id = reservations.room_id', 'left') -&gt;where('reservations.id IS NULL', null, false) -&gt;where('reservations.date', $date) -&gt;where('reservations.time_start&lt;=', $time_start) -&gt;where('reservations.time_finish&gt;=', $time_finish) -&gt;get('rooms');。我的预订表是空的,所以 $query 结果应该返回所有房间但也是空的:( 我不太了解 codeigniter,但您应该将 reservations.date 和 time_start/time_finish 部分全部加入。在 where 子句中应该只有 reservations.id 为空部分。试试这样的:$query = $this-&gt;db-&gt;join('reservations', "rooms.id = reservations.room_id and reservations.date = '$date' and reservations.time_start&lt;= '$time_start' and reservations.time_finish&gt;='$time_finish'", 'left') -&gt;where('reservations.id IS NULL', null, false)-&gt;get('rooms');

以上是关于在php中用对象过滤2个数组的主要内容,如果未能解决你的问题,请参考以下文章

如何比较 2 个数组中的值以过滤掉元素

php数组的重复值如何过滤掉

Angular2使用管道基于对象数组过滤对象数组

按匹配不同数组的属性过滤字典数组

Swift:获取由某个属性过滤的对象数组的索引

23种设计模式之过滤模式