Home > other >  Array sum of selected dates from the array of rooms with set dates and prices
Array sum of selected dates from the array of rooms with set dates and prices

Time:02-17

I've got an array of selected dates and an array of rooms with set dates and prices. From the array $selectedDates, it should look for a date from the rooms. If one of the $selectedDates is found from each room, it should use the price under the options keys if not it should use the default_price key.

$selectedDates = ['10-04-2022', '11-04-2022', '12-04-2022'];

$setRooms = [
  0 => [
    'id' => 1,
    'title' => 'Room1',
    'default_price' => 50,
    'options' => [
      0 => [
        'date' => '12-04-2022',
        'price' => 100,
      ],
      1 => [
        'date' => '13-04-2022',
        'price' => 200,
      ],
      3 => [
        'date' => '14-04-2022',
        'price' => 200,
      ],
    ]
  ],
 1 => [
    'id' => 2,
    'title' => 'Room2',
    'default_price' => 120,
    'options' => [
      0 => [
        'date' => '11-04-2022',
        'price' => 200,
      ],
      1 => [
        'date' => '12-04-2022',
        'price' => 300,
      ],
      3 => [
        'date' => '13-04-2022',
        'price' => 400,
      ],
    ]
  ],
]

Expected Output:

[
  // '10-04-2022' = 50 (default_price), '11-04-2022' = 50 (default_price), '12-04-2022' = 100 (using the option price). 50   50   100 = 200
  0 => [
    'id' => 1,
    'title' => 'Room1',
    'total_price' => 200 
  ],
   // '10-04-2022' = 50 (default_price), '11-04-2022' = 200 (using the option price), '12-04-2022' = 300 (using the option price). 120   200   300 = 620
  1 => [
    'id' => 2,
    'title' => 'Room2',
    'total_price' => 620
  ]
]

This is what I've done so far. But it turns out that room 2 is giving me a different output, it's like the sum of room 1 will be added to room 2.

$price = 0;
$roomBookings = [];
foreach ($hotelRooms as $key => $room) {

    $count = count($listOfSelectedDates);
    foreach ($listOfSelectedDates as $selectedDate) {

        $getPrice = HelperTrait::searchForDate($selectedDate, $room['options']);
        if ($getPrice['success']) {
            $price  = $getPrice['price'];
        }
        else {
            $price  = $room['default_price'];
        }
        $room['total_price'] = $price;
    }
    $roomBookings[] = $room;
}

/////
public static function searchForDate($date, $array): array
{
    foreach ($array as $key => $val) {
        $date = Carbon::parse($date)->format('d-m-Y');
        $arrDate = Carbon::parse($val['date'])->format('d-m-Y');

        if ($arrDate === $date) {
            return [
                'success' => true,
                'price' => $val['price']
           ];
        }
    }

    return [
        'success' => false
    ];
}

Let me know if you have any questions. Thanks in advance!

CodePudding user response:

$setRooms = [
    [
        'id'            => 1,
        'title'         => 'Room1',
        'default_price' => 50,
        'options'       => [
            [ 'date' => '12-04-2022', 'price' => 100, ],
            [ 'date' => '13-04-2022', 'price' => 200, ],
            [ 'date' => '14-04-2022', 'price' => 200, ],
        ]
    ],
    [
        'id'            => 2,
        'title'         => 'Room2',
        'default_price' => 120,
        'options'       => [
            [ 'date' => '11-04-2022', 'price' => 200, ],
            [ 'date' => '12-04-2022', 'price' => 300, ],
            [ 'date' => '13-04-2022', 'price' => 400, ],
        ]
    ],
];

$selectedDates = [ '10-04-2022', '11-04-2022', '12-04-2022' ];

$result = [];

foreach ($setRooms as $room) {
  $total = 0;
  foreach ($selectedDates as $date) {
    $filtered = array_filter($room['options'], fn($option) => $date === $option['date']);
    if (count($filtered) === 1) {
      $total  = $filtered[array_key_first($filtered)]['price'];
    } else {
      $total  = $room['default_price'];
    }
  }
  $result[] = [ 'id' => $room['id'], 'title' => $room['title'], 'total_price' => $total ];
}

print_r($result);

Output:

Array
(
    [0] => Array
        (
            [id] => 1
            [title] => Room1
            [total_price] => 200
        )

    [1] => Array
        (
            [id] => 2
            [title] => Room2
            [total_price] => 620
        )

)
  •  Tags:  
  • php
  • Related