Каким образом можно изменить или преобразовать массив?

Всем привет! Можете подсказать, как реализовать логику преобразования массива `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,
```
  • 20 ноября 2024 г. 9:23
Ответы на вопрос 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);
Похожие вопросы