У меня есть такие параметры, которые необходимо отсортировать (Примечание: я сортирую ПОСЛЕ преобразования комбинаций ключ => значение в строки):
$param['SignatureMethod'] = 'HmacSHA256';
$param['SignatureVersion'] = '2';
$param['Timestamp'] = gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time());
$param['Version'] = '2011-10-01';
$param['SellerSKUList.SellerSKU.1'] = $sku1;
$param['SellerSKUList.SellerSKU.2'] = $sku2;
$param['SellerSKUList.SellerSKU.3'] = $sku3;
$param['SellerSKUList.SellerSKU.4'] = $sku4;
Всего у меня около 30 параметров. Чтобы вызвать конечную точку, мне нужно сгенерировать подпись параметров в алфавитном порядке.
Использование PHP sort()
отлично работает для менее чем 10, но когда я пытаюсь использовать 20, это дает мне такой вывод:
SellerSKUList.SellerSKU.10=4574&
SellerSKUList.SellerSKU.11=4575&
...
SellerSKUList.SellerSKU.18=4582&
SellerSKUList.SellerSKU.19=4583&
SellerSKUList.SellerSKU.1=4565&
SellerSKUList.SellerSKU.20=4584&
SellerSKUList.SellerSKU.2=4566
Мне нужно, чтобы это было так:
SellerSKUList.SellerSKU.1=4565&
SellerSKUList.SellerSKU.10=4574&
SellerSKUList.SellerSKU.11=4575&
...
SellerSKUList.SellerSKU.18=4582&
SellerSKUList.SellerSKU.19=4583&
SellerSKUList.SellerSKU.2=4566&
SellerSKUList.SellerSKU.20=4584
Функция сортировки выглядит так:
$url = array();
foreach ($param as $key => $val) {
$key = str_replace("%7E", "~", rawurlencode($key));
$val = str_replace("%7E", "~", rawurlencode($val));
$url[] = "{$key}={$val}";
}
sort($url);
Мне кажется, что функция sort() должна давать желаемый результат, но мой опыт показывает другое. Есть ли другая функция или другой способ сортировки от 1 до 10 в строке?
Я пытался:
usort($url,strcmp) => 10,11,12...1,20,2
uksort($url,strcmp) => 10,11,12...20,2,1
natsort($url) => 1,2,3,...10,11,12
Desired: => 1,10,11...19,2,20