Всем привет! Можете подсказать, как реализовать логику преобразования массива `messages` в новый массив `messages2`? Нужно сгруппировать сообщения по значению `customer_id`, сохранив их порядок отображения. В данном случае первым делом необходимо объединить элементы с `customer_id`, равным 1 и 2, затем 3 и 4 и так далее. Вот пример массивов:
```javascript
"messages": [
{
"id": 1,
"customer": "Dr. Kane Hill",
"customer_id": 1,
"created_at": "2024-11-19 11:18:57",
"text": "Hello, how are you?"
},
{
"id": 2,
"customer": "Dr. Kane Hill",
"customer_id": 1,
"created_at": "2024-11-19 11:20:57",
"text": "I am good, thanks! How about you?"
},
{
"id": 3,
"customer": "Prof. Samir McClure III",
"customer_id": 2,
"created_at": "2024-11-19 11:21:57",
"text": "Hey, what time is it?"
},
{
"id": 4,
"customer": "Prof. Samir McClure III",
"customer_id": 2,
"created_at": "2024-11-19 11:22:57",
"text": "It is 3 PM."
},
{
"id": 5,
"customer": "Shad Leffler",
"customer_id": 3,
"created_at": "2024-11-19 11:23:57",
"text": "Did you finish the project?"
},
{
"id": 6,
"customer": "Shad Leffler",
"customer_id": 3,
"created_at": "2024-11-19 11:24:57",
"text": "New mesh"
},
{
"id": 7,
"customer": "Prof. Samir McClure III",
"customer_id": 2,
"created_at": "2024-11-19 11:26:57",
"text": "Not bed?"
},
{
"id": 8,
"customer": "Prof. Samir McClure III",
"customer_id": 2,
"created_at": "2024-11-19 11:27:57",
"text": "Cool?"
}
]
"messages2": [
{
"customer": "Dr. Kane Hill",
"messages_id": 1,
"customer_id": 1,
"messages": [
{
"id": 1,
"created_at": "2024-11-19 11:18:57",
"text": "Hello, how are you?",
},
{
"id": 2,
```
Для реализации преобразования массива `messages` в новый массив `messages2`, где сообщения группируются по `customer_id`, можно использовать метод `reduce` в JavaScript. Пример ниже показывает, как можно это сделать:
```javascript
const messages = [
{
"id": 1,
"customer": "Dr. Kane Hill",
"customer_id": 1,
"created_at": "2024-11-19 11:18:57",
"text": "Hello, how are you?"
},
{
"id": 2,
"customer": "Dr. Kane Hill",
"customer_id": 1,
"created_at": "2024-11-19 11:20:57",
"text": "I am good, thanks! How about you?"
},
{
"id": 3,
"customer": "Prof. Samir McClure III",
"customer_id": 2,
"created_at": "2024-11-19 11:21:57",
"text": "Hey, what time is it?"
},
{
"id": 4,
"customer": "Prof. Samir McClure III",
"customer_id": 2,
"created_at": "2024-11-19 11:22:57",
"text": "It is 3 PM."
},
{
"id": 5,
"customer": "Shad Leffler",
"customer_id": 3,
"created_at": "2024-11-19 11:23:57",
"text": "Did you finish the project?"
},
{
"id": 6,
"customer": "Shad Leffler",
"customer_id": 3,
"created_at": "2024-11-19 11:24:57",
"text": "New mesh"
},
{
"id": 7,
"customer": "Prof. Samir McClure III",
"customer_id": 2,
"created_at": "2024-11-19 11:26:57",
"text": "Not bed?"
},
{
"id": 8,
"customer": "Prof. Samir McClure III",
"customer_id": 2,
"created_at": "2024-11-19 11:27:57",
"text": "Cool?"
}
];
const messages2 = Object.values(messages.reduce((acc, message) => {
// Формируем ключ по customer_id
const key = message.customer_id;
// Если ключа нет - создаём новый
if (!acc[key]) {
acc[key] = {
customer: message.customer,
messages_id: key,
customer_id: key,
messages: []
};
}
// Добавляем текущее сообщение в массив messages
acc[key].messages.push({
id: message.id,
created_at: message.created_at,
text: message.text
});
return acc;
}, {}));
console.log(messages2);
```
### Пояснение к коду:
1. **Reduce**: Используется для обхода каждого элемента массива `messages`. В качестве аккумулятора выступает объект, который будет хранить сгруппированные сообщения.
2. **Ключ для группировки**: В качестве ключа для группировки используется `customer_id`. Если сообщения с таким `customer_id` еще не добавлены в аккумулятор, создается новый объект с основными данными клиента.
3. **Добавление сообщений**: Каждое сообщение добавляется в массив `messages` внутри соответствующего объекта.
4. **Формат вывода**: В конце мы используем `Object.values()` для преобразования результирующего объекта (`acc`) обратно в массив.
Запустив этот код, вы получите требуемый массив `messages2`, где сообщения сгруппированы по `customer_id` с сохранением их порядка.
Делается одним проходом в цикле
Ключем выставляем поле по которому делать группировку и внутрь уже ложим нужные данные
В конце array_values() чтобы переиндексировать результат и сбросить ключи
https://3v4l.org/Z2n4V#v8.3.14
<?php $json_data = <<<JSON {"messages": [ { "id": 1, "customer": "Dr. Kane Hill", "customer_id": 1, "created_at": "2024-11-19 11:18:57", "text": "Hello, how are you?" }, { "id": 2, "customer": "Dr. Kane Hill", "customer_id": 1, "created_at": "2024-11-19 11:20:57", "text": "I am good, thanks! How about you?" }, { "id": 3, "customer": "Prof. Samir McClure III", "customer_id": 2, "created_at": "2024-11-19 11:21:57", "text": "Hey, what time is it?" }, { "id": 4, "customer": "Prof. Samir McClure III", "customer_id": 2, "created_at": "2024-11-19 11:22:57", "text": "It is 3 PM." }, { "id": 5, "customer": "Shad Leffler", "customer_id": 3, "created_at": "2024-11-19 11:23:57", "text": "Did you finish the project?" }, { "id": 6, "customer": "Shad Leffler", "customer_id": 3, "created_at": "2024-11-19 11:24:57", "text": "New mesh" }, { "id": 7, "customer": "Prof. Samir McClure III", "customer_id": 2, "created_at": "2024-11-19 11:26:57", "text": "Not bed?" }, { "id": 8, "customer": "Prof. Samir McClure III", "customer_id": 2, "created_at": "2024-11-19 11:27:57", "text": "Cool?" } ]} JSON; $messages = json_decode($json_data, true)['messages']; $messages2 = []; foreach($messages as $row) { $key = $row['customer_id']; $messages2[$key]['customer'] = $messages2[$key]['customer'] ?? $row['customer']; $messages2[$key]['message_id'] = $messages2[$key]['message_id'] ?? $row['id']; $messages2[$key]['customer_id'] = $messages2[$key]['customer_id'] ?? $row['customer_id']; $messages2[$key]['messages'][] = [ 'id' => $row['id'], 'created_at' => $row['created_at'], 'text' => $row['text'], ]; } $messages2 = array_values($messages2); echo json_encode($messages2, JSON_PRETTY_PRINT);