переупорядочить многомерный массив на основе значения внутреннего массива и дублированных значений

-4

У меня такой массив:

Array(
[0] => Array
(
[route_id] => 1539871200
[booking_id] => 171
[route] => Boattrip Destination 2
[date] => 18 October 2018
[time] => 14:00 - 16:00
)

[1] => Array
(
[route_id] => 1539856800
[booking_id] => 170
[route] => Boattrip Destination 2
[date] => 18 October 2018
[time] => 10:00 - 12:00
)

[2] => Array
(
[route_id] => 1539856800
[booking_id] => 162
[route] => Boattrip Destination 2
[date] => 18 October 2018
[time] => 10:00 - 12:00
)
)

Route_id всегда использует одни и те же значения date, time и route. Единственное, что отличается, это идентификаторы бронирования.

Теперь я хочу, чтобы массивы сортировались по route_id а затем создавали новый массив, имеющий структуру ниже

Array (

[1539871200] => Array
(
[route] => Boattrip Destination 2
[date] => 18 October 2018
[time] => 14:00 - 16:00
[booking_ids] => Array
(
[0] => 171
)
)

[1539856800] => Array
(
[route] => Boattrip Destination 2
[date] => 18 October 2018
[time] => 10:00 - 12:00
[booking_ids] => Array
(
[0] => 170
[1] => 162
)
)
)

Это была моя попытка:

$output = array();
foreach($bookings as $item) {
if(!isset($output[$item['route_id']])) {
$output[$item['route_id']] = array();
}
$catName = $item['route_id'];
unset($item['route_id']);
$output[$catName][] = $item;
}

Но это только группирует route_id.

спросил(а) 2018-10-12T12:10:00+03:00 1 год, 11 месяцев назад
0
69

Попробуйте что-то вроде этого:

$routes = [];
foreach ($yourArray as $booking)
{
$bookingId = $booking['booking_id'];
$routeId = $booking['route_id'];

// Initialise an empty array set
if (!array_key_exists($routeId, $routes)) {
// Create a new array for booking IDs
$booking['booking_ids'] = [];
// Remove the IDs you don't want
unset($booking['booking_id'], $booking['route_id']);

// Push your booking data
$routes[$routeId] = $booking;
}

// Push the current booking ID into an existing set
$routes[$routeId]['booking_ids'][] = $bookingId;
}

ответил(а) 2018-10-12T12:21:00+03:00 1 год, 11 месяцев назад
40

Я поставил ваш желаемый результат с использованием лучших практик. Не генерируются ненужные переменные. Нет вызовов unset(). Единственной функцией в этом фрагменте является ksort() и я даже не уверен, что вы этого хотите.

Код: (Демо)

foreach ($array as $set) {
if (isset($result[$set["route_id"]])) {
$result[$set["route_id"]]["booking_ids"][] = $set["booking_id"]; // push new element
} else {
$result[$set["route_id"]] = [
"route" => $set["route_id"], // new key name, transfer value
"date" => $set["date"], // transfer key and value
"time" => $set["time"], // transfer key and value
"booking_ids" => [$set["booking_id"]] // new key name, write value as first element
];
}
}
ksort($result); // ... you did say you wanted to sort them by route_id
var_export($result);

Выход:

array (
1539856800 =>
array (
'route' => 1539856800,
'date' => '18 October 2018',
'time' => '10:00 - 12:00',
'booking_ids' =>
array (
0 => 170,
1 => 162,
),
),
1539871200 =>
array (
'route' => 1539871200,
'date' => '18 October 2018',
'time' => '14:00 - 16:00',
'booking_ids' =>
array (
0 => 171,
),
),
)

ответил(а) 2018-10-13T18:38:00+03:00 1 год, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема