使用PHP检查并删除多维数组中的数组值

时间:2014-11-21 06:25:25

标签: php mysql for-loop multidimensional-array

我设计了预订房间的系统,并通过多维数组表格存储数据。 现在我想编写关于查找在时间和日期(from,to,date)上重复的数组值的函数。

逻辑是一个房间可以在一天内预订一次或更多但是在同一时期内不能由一个或多个用户预订。例如,约翰在2014年8月15日预订了1300-1500,所以没有人可以在此期间预订。

虽然我能理解逻辑,但我不知道如何实现关于删除这些值的功能。

这是数组(数据):

    $recordBooking = array(
            "112"=>array(
                "date"=>array(
                    "24/09/2014"=>array(
                        array(
                            "from"=>1,
                            "to"=>3,
                            "username"=>"Amy"
                                ),
                        array(   //duplicate data 
                            "from"=>2,
                            "to"=>5,
                            "username"=>"John"
                                )   
                        ),
                    "27/09/2014"=>array(
                        array(
                            "from"=>1,
                            "to"=>3,
                            "username"=>"Chars"
                                )
                        ),
                    "29/09/2014"=>array(
                        array(
                            "from"=>1,
                            "to"=>5,
                            "username"=>"Peter"
                                )
                        ),
                    "30/09/2014"=>array(
                        array(
                            "from"=>3,
                            "to"=>6,
                            "username"=>"Amy"
                                )
                        )
                    )
                )
        );

我想设置警报消息,并在检测到重复数据时删除重复的值。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

对于数组过滤,发明了array_filter函数。假设您已经在迭代日期:

$booked = []; // holder for already booked
$result = array_filter(
  $recordBooking['112']['date']['24/09/2014'], // array value when iterating dates
  function($rb) use (&$booked) { // will filter this date

    foreach($booked as $b) {
      if(
        ($b['from'] < +$rb['from'] && $b['to'] > +$rb['from']) ||
        ($b['from'] < +$rb['to'] && $b['to'] > +$rb['to'])
      ) { // already booked!!!
        echo "ALERT. Skipped: ${rb['username']}\n";
        return false;
      }
    }
    $booked[] = ['from' => +$rb['from'], 'to' => +$rb['to'] ]; // mark time as booked
    return true;
  }
);

var_dump($result); 

// ⇒
/*
ALERT. Skipped: John
array(1) {
  [0]=>
  array(3) {
    ["from"]=>
    int(1)
    ["to"]=>
    int(3)
    ["username"]=>
    string(3) "Amy"
  }
}
*/

希望它有所帮助。