PHP usort 函数对具有递增元素的数组进行排序
PHP usort function to sort array that has incrementing elements
我进退两难。因为我使用的是亚马逊的 MWS,所以在对内容进行哈希处理之前,我必须完全按照亚马逊的顺序获取数组的顺序,否则我制作的哈希和亚马逊制作的哈希将不匹配,亚马逊将不会接受我的提要。
虽然我知道 PHP 的 usort
,但我从未使用过它,所以我不太确定如何创建满足我需要的函数。
这是数组:
Array (
[0] => AWSAccessKeyId=XXXXXXXX
[1] => Action=ListInventorySupply
[2] => MarketplaceId=XXXXXXX
[3] => ResponseGroup=Basic
[4] => SellerId=XXXXXX
[5] => SellerSkus.member.10=SKU10
[6] => SellerSkus.member.11=SKU11
[7] => SellerSkus.member.1=SKU1
[8] => SellerSkus.member.2=SKU2
[9] => SellerSkus.member.3=SKU3
[10] => SellerSkus.member.4=SKU4
[11] => SellerSkus.member.5=SKU5
[12] => SellerSkus.member.6=SKU6
[13] => SellerSkus.member.7=SKU7
[14] => SellerSkus.member.8=SKU8
[15] => SellerSkus.member.9=SKU9
[16] => SignatureMethod=HmacSHA256
[17] => SignatureVersion=2
[18] => Timestamp=2016-04-06T22%3A26%3A41Z
[19] => Version=2010-10-01
)
问题是亚马逊的排序略有不同:
Array (
[0] => AWSAccessKeyId=XXXXXXXX
[1] => Action=ListInventorySupply
[2] => MarketplaceId=XXXXXXX
[3] => ResponseGroup=Basic
[4] => SellerId=XXXXXX
[5] => SellerSkus.member.1=SKU1
[6] => SellerSkus.member.10=SKU10
[7] => SellerSkus.member.11=SKU11
[8] => SellerSkus.member.2=SKU2
[9] => SellerSkus.member.3=SKU3
[10] => SellerSkus.member.4=SKU4
[11] => SellerSkus.member.5=SKU5
[12] => SellerSkus.member.6=SKU6
[13] => SellerSkus.member.7=SKU7
[14] => SellerSkus.member.8=SKU8
[15] => SellerSkus.member.9=SKU9
[16] => SignatureMethod=HmacSHA256
[17] => SignatureVersion=2
[18] => Timestamp=2016-04-06T22%3A26%3A41Z
[19] => Version=2010-10-01
)
您会看到前三个 SellerSkus.member.{#}
元素的键是不同的。我需要能够保持剩余的排序相同,除了当有 10 个或更多 SKU 时它需要像亚马逊的排序那样排序。
我已经阅读了 PHP doc for usort,但我仍然没有找到超过 10 个项目的任何内容。似乎我必须跟踪 SellerSkus.member.{#}
数字,以便对它们进行正确排序,但我不知道如何使用 usort
来做到这一点。任何正确方向的指导都会很棒!谢谢。
看起来你想要一个普通的字典排序,但是比较时只使用=
之前的字符串部分。所以你的比较函数应该找到=
,得到之前的子字符串,然后比较它们。
usort($array, function($a, $b) {
$a = substr($a, 0, strpos($a, '='));
$b = substr($b, 0, strpos($b, '='));
return ($a < $b) ? -1 : 1;
});
我进退两难。因为我使用的是亚马逊的 MWS,所以在对内容进行哈希处理之前,我必须完全按照亚马逊的顺序获取数组的顺序,否则我制作的哈希和亚马逊制作的哈希将不匹配,亚马逊将不会接受我的提要。
虽然我知道 PHP 的 usort
,但我从未使用过它,所以我不太确定如何创建满足我需要的函数。
这是数组:
Array (
[0] => AWSAccessKeyId=XXXXXXXX
[1] => Action=ListInventorySupply
[2] => MarketplaceId=XXXXXXX
[3] => ResponseGroup=Basic
[4] => SellerId=XXXXXX
[5] => SellerSkus.member.10=SKU10
[6] => SellerSkus.member.11=SKU11
[7] => SellerSkus.member.1=SKU1
[8] => SellerSkus.member.2=SKU2
[9] => SellerSkus.member.3=SKU3
[10] => SellerSkus.member.4=SKU4
[11] => SellerSkus.member.5=SKU5
[12] => SellerSkus.member.6=SKU6
[13] => SellerSkus.member.7=SKU7
[14] => SellerSkus.member.8=SKU8
[15] => SellerSkus.member.9=SKU9
[16] => SignatureMethod=HmacSHA256
[17] => SignatureVersion=2
[18] => Timestamp=2016-04-06T22%3A26%3A41Z
[19] => Version=2010-10-01
)
问题是亚马逊的排序略有不同:
Array (
[0] => AWSAccessKeyId=XXXXXXXX
[1] => Action=ListInventorySupply
[2] => MarketplaceId=XXXXXXX
[3] => ResponseGroup=Basic
[4] => SellerId=XXXXXX
[5] => SellerSkus.member.1=SKU1
[6] => SellerSkus.member.10=SKU10
[7] => SellerSkus.member.11=SKU11
[8] => SellerSkus.member.2=SKU2
[9] => SellerSkus.member.3=SKU3
[10] => SellerSkus.member.4=SKU4
[11] => SellerSkus.member.5=SKU5
[12] => SellerSkus.member.6=SKU6
[13] => SellerSkus.member.7=SKU7
[14] => SellerSkus.member.8=SKU8
[15] => SellerSkus.member.9=SKU9
[16] => SignatureMethod=HmacSHA256
[17] => SignatureVersion=2
[18] => Timestamp=2016-04-06T22%3A26%3A41Z
[19] => Version=2010-10-01
)
您会看到前三个 SellerSkus.member.{#}
元素的键是不同的。我需要能够保持剩余的排序相同,除了当有 10 个或更多 SKU 时它需要像亚马逊的排序那样排序。
我已经阅读了 PHP doc for usort,但我仍然没有找到超过 10 个项目的任何内容。似乎我必须跟踪 SellerSkus.member.{#}
数字,以便对它们进行正确排序,但我不知道如何使用 usort
来做到这一点。任何正确方向的指导都会很棒!谢谢。
看起来你想要一个普通的字典排序,但是比较时只使用=
之前的字符串部分。所以你的比较函数应该找到=
,得到之前的子字符串,然后比较它们。
usort($array, function($a, $b) {
$a = substr($a, 0, strpos($a, '='));
$b = substr($b, 0, strpos($b, '='));
return ($a < $b) ? -1 : 1;
});