Уникальная сортировка массива PHP Regular не работает должным образом

Я использую print_r(array_unique($array, SORT_REGULAR)); в массиве ниже, но он не работает.

Я пытаюсь отфильтровать избыточные данные.

Обратите внимание, что [Order] и его пары ключ-значение одинаковы. Но [Transaction] и его пары ключ-значение уникальны.

Мне нужно получить данные элемента [Order] и объединить их с тремя разными элементами [Transaction].

Мой массив

Array
(
    [0] => Array
        (
            [Order] => Array
                (
                    [PO] => TR11214
                    [OrderID] => 242856952012
                )

            [Transaction] => Array
                (
                    [TransPO] => TR11211
                    [TransactionPrice] => 91.17
                )

        )

    [1] => Array
        (
            [Order] => Array
                (
                    [PO] => TR11214
                    [OrderID] => 242856952012
                )

            [Transaction] => Array
                (
                    [TransPO] => TR11212
                    [TransactionPrice] => 180.41
                )

        )

    [2] => Array
        (
            [Order] => Array
                (
                    [PO] => TR11214
                    [OrderID] => 242856952012
                )

            [Transaction] => Array
                (
                    [TransPO] => TR11213
                    [TransactionPrice] => 209.99
                )

        )

)

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

Array
(
    [Order] => Array
        (
            [PO] => TR11214
            [OrderID] => 242856952012
        )

    [Transaction] => Array
        (
            [0] => Array
                (
                    [TransPO] => TR11211
                    [TransactionPrice] => 91.17
                )

            [1] => Array
                (
                    [TransPO] => TR11212
                    [TransactionPrice] => 180.41
                )

            [2] => Array
                (
                    [TransPO] => TR11213
                    [TransactionPrice] => 209.99
                )

        )

)

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

мой код:

$myarray = array(
    0 => array(
    "Order" => array("PO" => "TR11214", "OrderID" => 242856952012),
    "Transaction" => array("TransPO" => "TR11211", "TransactionPrice" => 91.17)
    ),
    1 => array(
    "Order" => array("PO" => "TR11214", "OrderID" => 242856952012),
    "Transaction" => array("TransPO" => "TR11212", "TransactionPrice" => 180.41)
    ),
    2 => array(
    "Order" => array("PO" => "TR11214", "OrderID" => 242856952012),
    "Transaction" => array("TransPO" => "TR11213", "TransactionPrice" => 209.99)
    )
);


print_r(array_unique($myarray, SORT_REGULAR));

вы можете использовать foreach и перенести содержимое в другой контейнер. используйте необходимые ключи соответственно

Kevin 23.01.2019 02:37

Что делать, если ваш входной массив содержит несколько заказов разные?

Nick 23.01.2019 02:53

@Nick Ник, я установлю оператор if. элемент Order всегда будет иметь одни и те же данные в этом случае оператора if.

Mike 23.01.2019 02:55

Но в таком случае зачем вам array_unique? Или это для условия if?

Nick 23.01.2019 03:03

@Ник, оператор if будет стоять перед этим сценарием выше. Это означает, что входной массив с несколькими одинаковыми элементами Order встречается только в редких случаях, и мой код будет выполняться для управления массивом только тогда, когда эти редкие экземпляры появляются. Мне просто нужно получить массив так, как мне нужно в этом редком случае.

Mike 23.01.2019 03:11

@ Ник, я попробовал твой ответ до того, как ты его удалил, и он действительно работает. Просто пытаюсь отредактировать его, чтобы он лучше работал в моем коде.

Mike 23.01.2019 03:57

@Mike Я обновил и восстановил на основе ваших комментариев к ответу

Nick 23.01.2019 04:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
372
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

array_unique() предназначен для одномерных массивов. Если вы хотите использовать его в многомерном массиве, вам следует вместо этого рассмотреть возможность использования usort(). Затем вам нужно будет вручную перебрать массив в обратном порядке, найти дубликаты и удалить их.

Ответ принят как подходящий

Если вы хотите определить, сколько уникальных значений элемента Order содержится в вашем массиве, вам необходимо применить array_uniqueТолько к элементам Order, что вы можете сделать с помощью array_column:

$unique_orders = count(array_unique(array_column($myarray, 'Order'), SORT_REGULAR));

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

$non_unique_keys = ['Transaction'];
$output = array();
foreach (array_keys($myarray[0]) as $key) {
    if (in_array($key, $non_unique_keys)) {
        $output[$key] = array_column($myarray, $key);
    }
    else {
        $output[$key] = $myarray[0][$key];
    }
}
print_r($output);

Пример вывода:

Array ( 
    [Order] => Array (
        [PO] => TR11214
        [OrderID] => 242856952012
    ) 
    [Sales Tax] => Array (
        [PO] => TR11214
        [SalesTaxAmount] => 0 
    )
    [Transaction] => Array (
        [0] => Array (
            [TransPO] => TR11211
            [TransactionPrice] => 91.17
        )
        [1] => Array (
            [TransPO] => TR11212
            [TransactionPrice] => 180.41
        )
        [2] => Array (
            [TransPO] => TR11213
            [TransactionPrice] => 209.99
        )
    )
)

Демо на 3v4l.org

Ник, а что, если во входной массив добавить еще один элемент? Например, другой элемент после элемента Order с именем Salestax, например, [SalesTax] => Array ( [PO] => TR11214 [SalesTaxAmount] => 0.00). Я должен вручную ввести имя элемента в вашем фрагменте кода? Я пытаюсь сделать все динамичным.

Mike 23.01.2019 03:17

Если это единственный уникальный элемент, такой как Order, вы можете добавить 'SalesTax' => $myarray[0]['SalesTax'] в выходной массив. Или, если есть несколько значений, тогда 'SalesTax' => array_column($myarray, 'SalesTax')

Nick 23.01.2019 03:21
Salestax будет таким же, как элемент Order. Это будут избыточные данные. Помимо Order, Salestax и Transaction, в массиве есть и другие элементы. Но все данные элементов избыточны, кроме Transaction, который уникален в каждом массиве.
Mike 23.01.2019 03:25

очень здорово. Я пытался сделать то, что вы сделали с foreach, прежде чем вы обновили ответ, но не смог его получить. Ваш ответ в точку. Это должно работать для других элементов в массиве, таких как Transaction, верно? Просто добавить ключ элемента в массив non_unique_keys ? например, есть элемент с именем Payment, и иногда на каждый Order приходится более 1 платежа. В этом случае мне понадобится этот код, чтобы он делал то же самое, что и для элемента Transaction.

Mike 23.01.2019 04:59

@ Майк да - в этом случае вы должны добавить 'Payment' в массив $non_unique_keys. Однако обратите внимание, что если вы можете получить повторяющиеся значения в одном из этих столбцов (например, в случае, когда было несколько платежей, но количество платежей отличается от количества транзакций), вам нужно будет использовать array_unique в столбце. См. мой обновленный демо - он показывает случай с 2 ​​платежами и 3 транзакциями, поэтому платеж дублируется.

Nick 23.01.2019 05:04

Понятно. Я протестирую его с несколькими элементами Payment и позже оставлю еще один комментарий. Как всегда, спасибо за вашу помощь.

Mike 23.01.2019 05:11

Другие вопросы по теме