Удалить дублирующую комбинацию элементов из многомерного массива - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть массив с полями:

$products = array(
    [0] => array('name' => 'product_one', 'category' => 'category_one', employee => '3234'),
    [1] => array('name' => 'product_two', 'category' => 'category_two', employee => '5421'),
    [2] => array('name' => 'product_three', 'category' => 'category_one', employee => '3234'),
    [3] => array('name' => 'product_one', 'category' => 'category_one', employee => '2153'),
    [4] => array('name' => 'product_one', 'category' => 'category_two', employee => '6312')        
)

Теперь, в этом случае, поле employee не важно, но комбинация product / category уникальна.

Требуемый результат:

$products = array(
    [0] => array('name' => 'product_one', 'category' => 'category_one', employee => '3234'),
    [1] => array('name' => 'product_two', 'category' => 'category_two', employee => '5421'),
    [2] => array('name' => 'product_three', 'category' => 'category_one', employee => '3234'),
    [4] => array('name' => 'product_one', 'category' => 'category_two', employee => '6312')        
)

Есть идеи, как лучше всего это сделать? На производстве у меня более 30 000 элементов и обычно около 10 дубликатов. Также в реальной базе данных у меня 12 полей, и комбинация из 4 из них должна быть уникальной).

1 Ответ

1 голос
/ 13 апреля 2020

Если вы не возражаете против того, какие из дубликатов вы храните, вероятно, проще всего перебрать l oop, создав новый массив с ключами, которые являются комбинацией требуемых уникальных значений (я использовал разделитель из ## в этом коде вы можете использовать все, что не может встречаться в значениях). Таким образом, дубликаты будут автоматически удалены, поскольку массив не может иметь одинаковые ключи. Как только l oop будет выполнено, выходной массив может быть переиндексирован численно с использованием array_values:

$output = array();
foreach ($products as $p) {
    $output["{$p['name']}##{$p['category']}"] = $p;
}

$output = array_values($output);
print_r($output);

Выход (для ваших данных выборки):

Array
(
    [0] => Array
        (
            [name] => product_one
            [category] => category_one
            [employee] => 2153
        )
    [1] => Array
        (
            [name] => product_two
            [category] => category_two
            [employee] => 5421
        )
    [2] => Array
        (
            [name] => product_three
            [category] => category_one
            [employee] => 3234
        )
    [3] => Array
        (
            [name] => product_one
            [category] => category_two
            [employee] => 6312
        )
)

Демо на 3v4l.org

...