Массив объединить в многомерный ключ - PullRequest
0 голосов
/ 16 ноября 2018

У меня возникли проблемы с решением слияния массива с многомерным массивом.

Мой массив выглядит так:

Array
(
    [0] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_Sinoskysun International (HK) CO., LTD
        )

    [1] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_RUTRONIK Elektronische Ba
        )

    [2] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_TTI
        )

    [3] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_ARROW CENTRAL EUROPE GMBH
        )

    [4] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_TDK
        )

    [5] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_YANGZHIDING ELECTRONICS
        )
     [6] => Array
        (
            [id] => 41301
            [regNumber] => P+CSM-302.01
            [name] => 100n SMD 0603 5% X7R 25V
            [madeBy2] => 
        )
     [7] => Array
        (
            [id] => 24526
            [regNumber] => P+CSM-097.04
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_TDK
        )
)

И мне нужно объединить их как:

Array
(
    [0] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Array
            (
                "Pro_Sinoskysun International (HK) CO., LTD",
                "Pro_RUTRONIK Elektronische Ba",
                "Pro_TTI",
                "Pro_ARROW CENTRAL EUROPE GMBH",
                "Pro_TDK",
                "Pro_YANGZHIDING ELECTRONICS"
            )
       )
     [1] => Array
        (
            [id] => 41301
            [regNumber] => P+CSM-302.01
            [name] => 100n SMD 0603 5% X7R 25V
            [madeBy2] => 
        )
     [2] => Array
        (
            [id] => 24526
            [regNumber] => P+CSM-097.04
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_TDK
        )
)

Входной массив может состоять из 5 или 500 элементов, и мне нужно объединить их по ID. Есть только одна вещь, отличная друг от друга и от того, кто их создал. Это как-то возможно?

Если нужно что-то еще, я могу добавить это. :)

Большое спасибо за помощь.

Ответы [ 3 ]

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

Я строю массив, который индексируется по значению id из данных, если он еще не установлен, тогда я создаю новый элемент с данными - хотя madeBy2 создается как массив. Если элемент уже существует, он добавляет новое значение в существующий список значений (используя []) ...

$out = [];
foreach ( $inp as $data )   {
    if ( isset ($out[$data['id']])) {
        $out[$data['id']]["madeBy2"][] = $data["madeBy2"];
    }
    else {
        $out[$data['id']] = [ "id"=>$data['id'],
            "regNumber" => $data['regNumber'],
            "name" => $data['name'],
            "madeBy2" => [$data['madeBy2']]];
    }
}
print_r(array_values($out));

Это оставит массив индексированным id, поэтому я использую array_values() в print_r(), вы можете оставить его, если он вам нужен.

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

Комментарии в коде

foreach ($array as $arr) {
    if(!isset($output[$arr["id"]])){ // if item does not exist
        $output[$arr["id"]] = $arr; // create array
        $output[$arr["id"]]['madeBy2'] = [$output[$arr["id"]]['madeBy2']]; // change type on madeBy2 to array
    }else{    
        $output[$arr["id"]]['madeBy2'][] = $arr['madeBy2']; // it item exist add madeBy2 to the list
    }
}
$output = array_values($output); // remove associative array keys.
print_r($output);

Этот метод не основан на сортировке списка, и только madeBy2 является жестким кодом.
Это означает, что если в одном массиве есть дополнительный элемент, этот метод будет использовать его вместо метода Найджела.
Выход:

Array
(
    [0] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100nSMD060310%X7R25V
            [madeBy2] => Array
                (
                    [0] => Pro_SinoskysunInternational(HK) CO.,LTD
                    [1] => Pro_RUTRONIKElektronischeBa
                    [2] => Pro_TTI
                    [3] => Pro_ARROWCENTRALEUROPEGMBH
                    [4] => Pro_TDK
                    [5] => Pro_YANGZHIDINGELECTRONICS
                )

        )

    [1] => Array
        (
            [id] => 41301
            [regNumber] => P+CSM-302.01
            [name] => 100n SMD 0603 5% X7R 25V
            [madeBy2] => Array
                (
                    [0] => 
                )

        )

    [2] => Array
        (
            [id] => 24526
            [regNumber] => P+CSM-097.04
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Array
                (
                    [0] => Pro_TDK
                )

        )

)

https://3v4l.org/iCjk1

Демо с дополнительным предметом:
https://3v4l.org/0jmpL

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

Этот код будет выдавать желаемый результат независимо от того, имеет ли массив разные значения идентификатора.Этот код предполагает , что все аналогичные продукты сгруппированы по порядку:

$output = array();
$i = -1;
foreach ($array as $arr) {
    if ($i < 0 || $output[$i]['id'] != $arr['id'] || $output[$i]['regNumber'] != $arr['regNumber'] || $output[$i]['name'] != $arr['name']) {
        // new product
        $output[++$i] = $arr;
        $output[$i]['madeBy2'] = array($arr['madeBy2']);
    }
    else {
        // same product, new manufacturer
        $output[$i]['madeBy2'][] = $arr['madeBy2'];
    }
}
print_r($output);

Демонстрация на 3v4l.org

Альтернативаверсия превращает madeBy2 элемент в массив только при наличии нескольких значений:

$output = array();
$i = -1;
foreach ($array as $arr) {
    if ($i < 0 || $output[$i]['id'] != $arr['id'] || $output[$i]['regNumber'] != $arr['regNumber'] || $output[$i]['name'] != $arr['name']) {
        // new product
        $output[++$i] = $arr;
    }
    else {
        // same product, new manufacturer
        if (!is_array($output[$i]['madeBy2'])) 
            $output[$i]['madeBy2'] = array($output[$i]['madeBy2'], $arr['madeBy2']);
        else
            $output[$i]['madeBy2'][] = $arr['madeBy2'];
    }
}
print_r($output);

Вывод (для ваших примеров данных)

Array
(
    [0] => Array
        (
            [id] => 41844
            [regNumber] => CSM-057.05
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Array
            (
                "Pro_Sinoskysun International (HK) CO., LTD",
                "Pro_RUTRONIK Elektronische Ba",
                "Pro_TTI",
                "Pro_ARROW CENTRAL EUROPE GMBH",
                "Pro_TDK",
                "Pro_YANGZHIDING ELECTRONICS"
            )
       )
     [1] => Array
        (
            [id] => 41301
            [regNumber] => P+CSM-302.01
            [name] => 100n SMD 0603 5% X7R 25V
            [madeBy2] => 
        )
     [2] => Array
        (
            [id] => 24526
            [regNumber] => P+CSM-097.04
            [name] => 100n SMD 0603 10% X7R 25V
            [madeBy2] => Pro_TDK
        )
)

Демонстрация на 3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...