переупорядочить многомерный массив на основе значения внутреннего массива и дублированных значений
У меня такой массив:
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
.
Попробуйте что-то вроде этого:
$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;
}
Я поставил ваш желаемый результат с использованием лучших практик. Не генерируются ненужные переменные. Нет вызовов 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,
),
),
)
Еще в рубрике
- Вопросы
- Duplicates
- переупорядочить многомерный массив на основе значения внутреннего массива и дублированных значений