Сравнение многомерных массивов и создание нового массива

#php #multidimensional-array

#php #многомерный массив

Вопрос:

У меня есть два разных массива:

Первый:

 Array(
 [0] => Array
        (
         [sku] => A
        )
 [1] => Array
        (
         [sku] => B
        )
 [2] => Array
        (
         [sku] => A
        )
)
 

Второй:

 Array(
 [0] => Array
        (
         [sku] => A
         [path] => 3
        )
 [1] => Array
        (
         [sku] => B
         [path] => 3
        )
 [2] => Array
        (
         [sku] => C
         [path] => 78
        )
)
 

Для того, чтобы я должен был удалить дубликат в первом массиве, после этого сравнить оба двух массива, найти тот же артикул и создать новый массив с артикулом и относительным путем. Как я могу этого добиться?

Заранее спасибо за помощь!

Комментарии:

1. Вы забыли добавить вопрос. В чем именно ваша проблема?

Ответ №1:

Вам просто нужно пересечь артикулы, предполагая, что у вас есть уникальные артикулы во втором массиве:

 <?php

$one = 
[
    [
        'sku' => 'A'
    ],
    [
        'sku' => 'B'
    ],
    [
        'sku' => 'A'
    ]
];
$two = 
[
    [
        'sku' => 'A',
        'path' => 3
    ],
    [
        'sku' => 'B',
        'path' => 3
    ],
    [
        'sku' => 'C',
        'path' => 78
    ]
];


$result = array_intersect_key(array_column($two, null, 'sku'), array_column($one, null, 'sku'));
var_export($result);
 

Выходной сигнал:

 array (
    'A' => 
    array (
      'sku' => 'A',
      'path' => 3,
    ),
    'B' => 
    array (
      'sku' => 'B',
      'path' => 3,
    ),
  )
 

Или получить массив с ключами sku, сопоставленными путям:

 $sku_paths = array_intersect_key(array_column($two, 'path', 'sku'), array_column($one, null, 'sku'));
var_export($sku_paths);
 

Выходной сигнал:

 array (
  'A' => 3,
  'B' => 3,
)
 

Комментарии:

1. Спасибо! это то, что мне нужно. Это работает 🙂

Ответ №2:

Если я правильно понял проблему, вам нужен третий массив со списком артикулов и путей для артикулов, который существует в первом массиве. Следующий код должен делать то, что вы ищете.

 <?php

$array1 = [
    [
        'sku' => 'A'
    ],
    [
        'sku' => 'B'
    ],
    [
        'sku' => 'A'
    ]
];

$array2 = [
    [
        'sku'  => 'A',
        'path' => 3
    ],
    [
        'sku'  => 'B',
        'path' => 3
    ],
    [
        'sku'  => 'C',
        'path' => 78
    ]
];

$uniqueSkuList = array_unique(array_map(static function ($el) {
    return $el['sku'];
}, $array1));

$array3 = [];
foreach ($array2 as $item) {
    if (in_array($item['sku'], $uniqueSkuList, true)) {
        $array3[] = $item;
    }
}

var_dump($array3);
 

Ответ №3:

В дополнение к двум уже существующим ответам я опишу это более алгоритмически, фактически реализуя логику, а не решая ее с помощью a function , чтобы вы могли извлечь из этого уроки.

 $result = [];

foreach ($array1 as $key1 => $value1) {
    foreach ($array2 as $key2 => $value2) {
        if (!isset($result[$value1['sku']])) {
            $result[$value1['sku']] = $value2['path'];
        }
    }
}