在PHP中过滤多维数组

时间:2016-11-23 14:51:57

标签: php arrays

我有这个包含我的预订的数组:

$bookings[] = array(
    'booking_id' => '1', 
    'client_firstname' => 'Gareth', 
    'days' => array(
        array('day_id' => '2016-11-23,2016-11-24', 'room_id' => '2'),
        array('day_id' => '2016-11-25', 'room_id' => '4'),
        array('day_id' => '2016-11-26,2016-11-27,2016-11-28', 'room_id' => '2'),
    )
);
$bookings[] = array(
    'booking_id' => '2', 
    'client_firstname' => 'James', 
    'days' => array(
        array('day_id' => '2016-11-25,2016-11-26,2016-11-27,2016-11-28', 'room_id' => '5')
    )
);
$bookings[] = array(
    'booking_id' => '2', 
    'client_firstname' => 'Marco', 
    'days' => array(
        array('day_id' => '2016-11-24', 'room_id' => '5')
    )
);

数组的解释:

  • 数组显示booking_idclient_name
  • 数组days包含酒店客户的时间表。此days数组中的每个数组都说明客户端在哪些日期以及在哪个房间。如果我有多条线路,客户会更换房间。

愿望

对于我给出的日期,我需要预订days array第一个日期对应于我给出的日期。

实施例

  • 我提供的日期是2016-11-25
  • 我需要得到:

    $bookings[] = array( 'booking_id' => '1', 'client_firstname' => 'Gareth', 'days' => array( array('day_id' => '2016-11-25', 'room_id' => '4') ) ); $bookings[] = array( 'booking_id' => '2', 'client_firstname' => 'James', 'days' => array( array('day_id' => '2016-11-25,2016-11-26,2016-11-27,2016-11-28', 'room_id' => '5') ) );

我尝试了什么

$day_value = '2016-11-23';
$bookings_ = array();
foreach($bookings as $b){
    foreach($b['days'] as $day){
       if(in_array($day_value,explode(',',$day['day_id'][0]))){
         $bookings_[]  = $b;
       }
    }
}
print_r($bookings_); 

但它将所有结果都归还给预订......

你能帮我吗?

感谢。

1 个答案:

答案 0 :(得分:2)

您认为$day['day_id'][0]是什么?

它是$day['day_id']的第一个符号,因为后者是一个字符串。因此,,$day['day_id'][0]不会爆炸任何内容。解决方案是删除[0]

foreach($bookings as $b){
    foreach($b['days'] as $day){
        if(in_array($day_value,explode(',',$day['day_id']))){
            // this string added:
            $b['days'] = $day;

            $bookings_[]  = $b;

            // btw, if your `$b['days']` has several elements
            // and in a couple of them there's a required date
            // then `$b` will be added to `$bookings_` several 
            // times, so probably you need `break`
            // break;
        }
    }
}