Я использую 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));
Что делать, если ваш входной массив содержит несколько заказов разные?
@Nick Ник, я установлю оператор if. элемент Order
всегда будет иметь одни и те же данные в этом случае оператора if.
Но в таком случае зачем вам array_unique
? Или это для условия if
?
@Ник, оператор if будет стоять перед этим сценарием выше. Это означает, что входной массив с несколькими одинаковыми элементами Order
встречается только в редких случаях, и мой код будет выполняться для управления массивом только тогда, когда эти редкие экземпляры появляются. Мне просто нужно получить массив так, как мне нужно в этом редком случае.
@ Ник, я попробовал твой ответ до того, как ты его удалил, и он действительно работает. Просто пытаюсь отредактировать его, чтобы он лучше работал в моем коде.
@Mike Я обновил и восстановил на основе ваших комментариев к ответу
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
)
)
)
Ник, а что, если во входной массив добавить еще один элемент? Например, другой элемент после элемента Order
с именем Salestax
, например, [SalesTax] => Array ( [PO] => TR11214 [SalesTaxAmount] => 0.00)
. Я должен вручную ввести имя элемента в вашем фрагменте кода? Я пытаюсь сделать все динамичным.
Если это единственный уникальный элемент, такой как Order
, вы можете добавить 'SalesTax' => $myarray[0]['SalesTax']
в выходной массив. Или, если есть несколько значений, тогда 'SalesTax' => array_column($myarray, 'SalesTax')
Salestax
будет таким же, как элемент Order
. Это будут избыточные данные. Помимо Order
, Salestax
и Transaction
, в массиве есть и другие элементы. Но все данные элементов избыточны, кроме Transaction
, который уникален в каждом массиве.
очень здорово. Я пытался сделать то, что вы сделали с foreach
, прежде чем вы обновили ответ, но не смог его получить. Ваш ответ в точку. Это должно работать для других элементов в массиве, таких как Transaction
, верно? Просто добавить ключ элемента в массив non_unique_keys
? например, есть элемент с именем Payment
, и иногда на каждый Order
приходится более 1 платежа. В этом случае мне понадобится этот код, чтобы он делал то же самое, что и для элемента Transaction
.
@ Майк да - в этом случае вы должны добавить 'Payment'
в массив $non_unique_keys
. Однако обратите внимание, что если вы можете получить повторяющиеся значения в одном из этих столбцов (например, в случае, когда было несколько платежей, но количество платежей отличается от количества транзакций), вам нужно будет использовать array_unique
в столбце. См. мой обновленный демо - он показывает случай с 2 платежами и 3 транзакциями, поэтому платеж дублируется.
Понятно. Я протестирую его с несколькими элементами Payment
и позже оставлю еще один комментарий. Как всегда, спасибо за вашу помощь.
вы можете использовать foreach и перенести содержимое в другой контейнер. используйте необходимые ключи соответственно