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
,你可以添加