2015-04-09 4 views
0

Я пытаюсь заполнить массив массивов, где room_id следует объединить в один поддиапазон, а не разделять, как в настоящее время. Вот мой код:Объединить подмассивы массива с одним и тем же ключом

$query = "SELECT res_id, room_id, guest_id, check_in_date, check_out_date FROM reservation "; 

$result = mysqli_query($link, $query) or die (mysqli_error($link)); 
$rooms = array(); 
while ($row = mysqli_fetch_assoc($result)) { 
    $rooms[] = $row; 
} 

$array_date = array(); 

foreach ($rooms as $room) { 
    $array_date[] = date_range($room['room_id'], $room['check_in_date'], $room['check_out_date']); 
} 

function date_range($room_id, $first, $last, $step = '+1 day', $output_format = 'Y-m-d') { 

    $room_date = array(); 
    $dates = array(); 
    $current = strtotime($first); 
    $last = strtotime($last); 

    while($current <= $last) { 
     $dates[] = date($output_format, $current); 
     $current = strtotime($step, $current); 
    } 
    $room_date[$room_id] = $dates; 

    return $room_date; 
} 

Вот результат с var_dump:

Array 
(
    [0] => Array 
     (
      [1] => Array 
       (
        [0] => 2015-04-08 
        [1] => 2015-04-09 
        [2] => 2015-04-10 
       ) 

     ) 

    [1] => Array 
     (
      [1] => Array 
       (
        [0] => 2015-04-11 
        [1] => 2015-04-12 
        [2] => 2015-04-13 
       ) 

     ) 

    [2] => Array 
     (
      [2] => Array 
       (
        [0] => 2015-04-08 
        [1] => 2015-04-09 
        [2] => 2015-04-10 
        [3] => 2015-04-11 
        [4] => 2015-04-12 
        [5] => 2015-04-13 
       ) 

     ) 

То, что я действительно хочу это (то же самое room_id объединены в одном массиве):

Array 
(
    [0] => Array 
     (
      [1] => Array 
       (
        [0] => 2015-04-08 
        [1] => 2015-04-09 
        [2] => 2015-04-10 
        [3] => 2015-04-11 
        [4] => 2015-04-12 
        [5] => 2015-04-13 
       ) 

     ) 
    [2] => Array 
     (
      [2] => Array 
       (
        [0] => 2015-04-08 
        [1] => 2015-04-09 
        [2] => 2015-04-10 
        [3] => 2015-04-11 
        [4] => 2015-04-12 
        [5] => 2015-04-13 
       ) 
     ) 
) 

Я полностью закончились идеи. Как объединить массивы с одним и тем же номером?

ответ

1

Я не думаю, что второй пример - это действительно структура, которую вы хотите - нет необходимости иметь нулевое индексированное первое измерение, если вы просто пытаетесь сохранить даты для каждого номера комнаты, так что измерение просто мешает. Я думаю, что лучший способ сделать это - передать существующий субарак, ссылаясь на функцию, чтобы он мог напрямую добавлять элементы в массив. Я переписал свой код (а также удаляется некоторая избыточность/неэффективность), как дополнительный цикл, чтобы производить то, что я думаю, что вы хотите:

$query = "SELECT res_id, room_id, guest_id, check_in_date, check_out_date FROM reservation "; 

$result = mysqli_query($link, $query) or die (mysqli_error($link)); 
$rooms = array(); 
$array_date = array(); 

while ($row = mysqli_fetch_assoc($result)) { 
    $rooms[] = $row; // This is no longer used, but I'm assuming you want it for something else later 

    if (!array_key_exists($row['room_id'], $array_date)) { 
     $array_date[$row['room_id']] = array(); 
     date_range($array_date[$row['room_id']], $row['room_id'], $row['check_in_date'], $row['check_out_date']); 
    } else { 
     date_range($array_date[$row['room_id']], $row['room_id'], $row['check_in_date'], $row['check_out_date']); 
    } 
} 



function date_range(&$currentDates, $room_id, $first, $last, $step = '+1 day', $output_format = 'Y-m-d') { 

    $current = strtotime($first); 
    $last = strtotime($last); 

    while($current <= $last) { 
     $currentDates[] = date($output_format, $current); 
     $current = strtotime($step, $current); 
    } 
} 

Это должно произвести массив так:

Array 
(
    [1] => Array // Room ID 
    (
     [0] => 2015-04-08 
     [1] => 2015-04-09 
     [2] => 2015-04-10 
     [3] => 2015-04-11 
     [4] => 2015-04-12 
     [5] => 2015-04-13 
    ) 
    [2] => Array // Room ID 
    (
     [0] => 2015-04-08 
     [1] => 2015-04-09 
     [2] => 2015-04-10 
     [3] => 2015-04-11 
     [4] => 2015-04-12 
     [5] => 2015-04-13 
    ) 
) 

Так вы можете перемещаться по датам доступных для каждой комнаты, только дела:

foreach ($array_date as $roomNumber => $dates) { 
    foreach ($dates as $date) { 
     // Do something 
    } 
} 

Это решение может позволить дубликатов записей для дат, в зависимости от того, как таблица создана. Чтобы избежать этих дубликатов, вы можете проверить, чтобы пропустить добавления дату, если номер уже зарезервирован, заменив содержимое цикла while в date_range() с чем-то вроде

if (!in_array(date($output_format, $current), $currentDates)) { 
    $currentDates[] = date($output_format, $current); 
} 

$current = strtotime($step, $current); 

Надеюсь, это поведение, которое вы хотите. Дайте мне знать, если нет!

+0

Я отредактировал это сообщение сильно, так как у моего первого решения были некоторые ошибки. –

+0

Это именно то, что мне нужно, спасибо вам большое. –

+0

Очень приветствуется. Удачи. :) –

Смежные вопросы