PHP数组唯一排序规则未按预期工作

PHP数组唯一排序规则未按预期工作,php,array-unique,Php,Array Unique,我正在使用print_r(array_unique($array,SORT_REGULAR)),但它不起作用 我正试图过滤掉多余的数据 请注意,[Order]及其键值对都是相同的。但是[Transaction]及其键值对是唯一的 我需要获取[Order]元素数据,并将其与3个不同的[Transaction]元素组合 我的阵列 Array ( [0] => Array ( [Order] => Array

我正在使用
print_r(array_unique($array,SORT_REGULAR)),但它不起作用

我正试图过滤掉多余的数据

请注意,
[Order]
及其键值对都是相同的。但是
[Transaction]
及其键值对是唯一的

我需要获取
[Order]
元素数据,并将其与3个不同的
[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));

array\u unique()
适用于一维数组。如果你想在多维数组上使用它,你应该考虑使用<代码> UsRoTo()< <代码>。然后需要手动反向遍历数组,搜索重复项并将其删除。

array\u unique()
适用于一维数组。如果你想在多维数组上使用它,你应该考虑使用<代码> UsRoTo()< <代码>。然后,您需要手动反向遍历数组,搜索重复项并将其删除。

如果要确定数组中有多少个
Order
元素的唯一值,则只需将
array\u unique
应用于
Order
元素,您可以使用
array\u 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
元素的唯一值,则只需将
array\u unique
应用于
Order
元素,您可以使用
array\u列

$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
        )
    )
)


您可以使用foreach并将内容转移到另一个容器中。根据需要使用键如果你的输入数组有多个不同的顺序怎么办?@Nick我将设置一个if语句。在if语句的情况下,
Order
元素将始终具有相同的数据。但是在这种情况下,为什么需要
array\u unique
?或者这是针对
if
条件的吗?@Nick if语句将出现在上述场景之前。也就是说,具有多个相同的
顺序
元素的输入数组只会出现在罕见的实例中,而我的代码只会在这些罕见的实例出现时执行以操纵数组。在这种罕见的情况下,我只需要以我需要的方式获取数组。您可以使用foreach并将内容传输到另一个容器。根据需要使用键如果你的输入数组有多个不同的顺序怎么办?@Nick我将设置一个if语句。在if语句的情况下,
Order
元素将始终具有相同的数据。但是在这种情况下,为什么需要
array\u unique
?或者这是针对
if
条件的吗?@Nick if语句将出现在上述场景之前。也就是说,具有多个相同的
顺序
元素的输入数组只会出现在罕见的实例中,而我的代码只会在这些罕见的实例出现时执行以操纵数组。在这种罕见的情况下,我只需要按我需要的方式获取数组。尼克,如果在输入数组中添加另一个元素会怎么样?例如,在名为
Salestax
Order
元素之后的另一个元素如下,
[Salestax]=>数组([PO]=>TR11214[SalesTaxAmount]=>0.00)
。我必须在你的代码中手动输入元素的名称?我正在尝试使一切都动态化。如果它是一个唯一的元素,如
Order
,则可以将
'SalesTax'=>$myarray[0]['SalesTax']
添加到输出数组中。或者,如果有多个值,则
'salesax'=>数组列($myarray,'salesax')
salesax
将与
Order
元素类似。这将是冗余数据。除了
订单
销售税
交易
之外,数组中还有其他元素。但是所有的元素数据都是冗余的,除了
事务
,它在每个数组中都是唯一的。非常棒。在您更新答案之前,我曾尝试过使用
foreach
执行您所做的操作,但未能完全获得答案。你的回答恰到好处。这应该适用于数组中的其他元素,如
Transaction
对吗?只需将元素键添加到
非唯一\u键
数组?例如,有一个名为
Payment
的元素,有时每个
订单有超过1笔付款。在这种情况下,我将需要此代码与它对
事务
元素所做的操作相同。@Mike yes-在这种情况下,您将向
$non_unique_key
数组添加
'Payment'
。但请注意,如果您可以在其中一列中获得重复的值(例如,存在多笔付款但付款数量与交易数量不同的情况),则需要在列上使用
array\u unique
。请参阅我的更新-这显示了一个案例,其中包含2笔付款和3笔交易,因此是重复付款。Nick,如果在输入数组中添加了另一个元素,该怎么办?例如,在名为
Salestax
Order
元素之后的另一个元素如下,
[Salestax]=>数组([PO]=>TR11214[SalesTaxAmount]=>0.00)
。我必须在你的代码中手动输入元素的名称?我试图让一切都变得动态。如果它是一个单一的独特元素,比如
Order
,你可以添加