Как объединить записи, но удалить ненужные дублированные данные? - PullRequest
0 голосов
/ 29 ноября 2018

Здравствуйте, мне было интересно, есть ли способ удаления дубликатов в массиве, но слияние правильных значений вместе?Например, если был один и тот же продукт с двумя разными изображениями, как объединить изображения в массив, а затем удалить запись, чтобы иметь одну запись в массиве

$cars = array(
    array(
        "id" => 22,
        "image" => "test.jpg",
        "car" => "Volvo"
    ) ,
    array(
        "car_id" => 23,
        "image" => "prototype.jpg",
        "car" => "BMW"
    ) ,
    array(
        "car_id" => 22,
        "image" => "test_1.jpg",
        "car" => "Volvo"
    ) ,
    array(
        "car_id" => 25,
        "image" => "unknown.jpg",
        "car" => "KIA"
    )
);

, и это выдает:

Array
(
    [0] => Array
        (
            [id] => 22
            [image] => test.jpg
            [car] => Volvo
        )

    [1] => Array
        (
            [car_id] => 23
            [image] => prototype.jpg
            [car] => BMW
        )

    [2] => Array
        (
            [car_id] => 22
            [image] => test_1.jpg
            [car] => Volvo
        )

    [3] => Array
        (
            [car_id] => 25
            [image] => unknown.jpg
            [car] => KIA
        )

)

Однако как мне добиться следующего?

Array
(
    [0] => Array
        (
            [id] => 22
            [image] => Array 
                       (
                          [0] => test.jpg
                          [1] => test_1.jpg
                       )
            [car] => Volvo
        )

    [1] => Array
        (
            [car_id] => 23
            [image] => prototype.jpg
            [car] => BMW
        )

    [2] => Array
        (
            [car_id] => 25
            [image] => unknown.jpg
            [car] => KIA
        )

)

1 Ответ

0 голосов
/ 29 ноября 2018

Одним из решений для вашего примера данных может быть создание нового массива $result и использование значения car в качестве ключа.На каждой итерации проверяют, есть ли ключ.Если это не так, добавьте текущий $car в цикле в качестве первого значения для этого ключа.

Если ключ существует, то преобразуйте строку с изображением $car в массив, содержащийэто одна строка.

Добавьте уже существующую строку изображения из $result в новый массив и сделайте массив новым значением.

Например:

$result = [];
foreach ($cars as $car) {
    if (!array_key_exists($car['car'], $result)) {
        $result[$car['car']] = $car;
        continue;
    }
    $car['image'] = (array)$car['image'];
    $car['image'][] = $result[$car["car"]]["image"];
    $result[$car['car']]['image'] = $car['image'];
}

print_r(array_values($result));

Если вы неЕсли вы хотите, чтобы автомобили были ключом, а не числами, вы можете использовать array_values ​​в конечном массиве, например:

print_r(array_values($result));

Демо

Результат

Array
(
    [0] => Array
        (
            [id] => 22
            [image] => Array
                (
                    [0] => test_1.jpg
                    [1] => test.jpg
                )

            [car] => Volvo
        )

    [1] => Array
        (
            [car_id] => 23
            [image] => prototype.jpg
            [car] => BMW
        )

    [2] => Array
        (
            [car_id] => 25
            [image] => unknown.jpg
            [car] => KIA
        )

)
...