【问题标题】:Compare two multidimensional arrays and unset matched elements比较两个多维数组和未设置的匹配元素
【发布时间】:2016-06-01 16:52:56
【问题描述】:

更新:收到回复后,我意识到我应该尝试使用数据库查询来解决这个问题,所以我写了a more detailed post here

原帖: 我想比较两个多维数组并去掉符合某个条件的元素。我知道我必须用一些键遍历数组然后取消设置,但我似乎无法正确执行。

这两个数组是$all,它存储了所有可用的房间和他们的床,$reserved,它只存储了保留的房间和保留的床。

我想遍历所有预订并获取位置 $reservations[x][0] 上的房间标题,其中 x 是当前查看的预订,并将其与 $all[a][0] 中的所有元素进行比较,其中 a 是当前查看的房间。

因此,当我发现 $all[0][0] => 'Luxury Room' 与 $reservations[0][0] => 'Luxury Room' 匹配时,我将查看床和位置 y 上的床代码,其中 y 是当前查看的床位代码$reservations[x][1][y] 并将其与匹配房间的所有可用床位进行比较,因此与$all[0][1][b] 比较,其中b 是所有可用房间。

当我发现$all[0][1][1]=>'xx2' 的值与$reservations[0][1][0]=>'xx2' 中的值匹配时,我将从$all 中取消设置索引01

所以最后,当我将遍历 $all 数组并将每个元素的索引 [0] 作为标题和索引 1 上的数组元素作为床时,我只会得到床 'xx2' 可用于'豪华房'

//$all is an array where index 0 is an array   
$all = array( 0=>array(
                    //index 0 has value 'Luxury Room' (room title)
                    0=>'Luxury Room',
                    //index 1 is an array
                    1=>array(
                            //where index 0 has value 'xx1' (bed code)
                            0=>'xx1',
                            //where index 1 has value 'xx2' (bed code)
                            1=>'xx2')),
            //again index 1 is an array etc. just as above...
            1=>array(
                    0=>'Cheap Room',
                    1=>array(
                            0=>'zz1',
                            1=>'zz2',
                            2=>'zz3',
                            3=>'zz4')));

$reserved = array( 0=>array(
                    0=>'Luxury Room',
                    1=>array(0=>'xx2')));

【问题讨论】:

  • 有没有办法通过适当的数据库查询而不是处理这个怪物?只是好奇。
  • 可能有,但我没有深入了解这个想法。基本上,我有一个带有 ID 的桌子房间,而 BEDS 与床的总数一致。所以我想通过一个循环将它转换成那个简单的数组,因为最后我需要的是可用的房间 ID 及其可用的床。第二张表是预订,它有 FROM(日期),TO(日期),ROOMS_ID( int) 和 BED_NUMBER (int)
  • 但我不知道如何编写一个查询来获取可用房间。将它们与每个房间及其床位的预订日期范围进行比较,然后返回一个表,其中每个字段中只有 ROOMS_ID 和床位号..
  • 对于异构项目,您应该使用关联数组而不是数值数组。
  • 您应该重新提出您的问题并改为使用 SQL。类似于“我如何通过 SQL 做到这一点?”并向我们​​展示您的表结构和所需的输出。以任何方式、形状或形式处理这样的数组都没有效率。

标签: php arrays multidimensional-array


【解决方案1】:

使用嵌套循环:

foreach ($all as &$room) {
    foreach ($reserved as $r) {
        if ($room[0] == $r[0]) { // same types of room
            foreach ($room[1] as $i => $code) {
                if (in_array($code, $r[1])) {
                    unset($room[1][$i]);
                }
            }
        }
    }
    $room[1] = array_values($room[1]); // Reset array indexes
}

$all 循环使用迭代变量的引用,以便unset() 调用修改原始数组。

DEMO

【讨论】:

  • 这是绝对正确的,我一直在尝试这样做。我现在知道这还不够,因为我仍然只需要取消设置的房间,这些房间的床位是为一个人试图预订的所有日子预留的。所以我又从查询开始了..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多