Сортировка PHP - получение 10, 11, 12 1, 20, 2, а не 1, 10, 11, 12 2, 20

У меня есть такие параметры, которые необходимо отсортировать (Примечание: я сортирую ПОСЛЕ преобразования комбинаций ключ => значение в строки):

$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

person Josiah    schedule 15.08.2014    source источник


Ответы (1)


Я нашел решение - если я uksort($params,strcmp) перед тем, как взорвать пары ключ => значение, порядок сортировки правильный.

uksort($param, 'strcmp');

$url = array();
foreach ($param as $key => $val) {

    $key = str_replace("%7E", "~", rawurlencode($key));
    $val = str_replace("%7E", "~", rawurlencode($val));
    $url[] = "{$key}={$val}";
}

Благодаря комментарию @Thomas Smart здесь: https://stackoverflow.com/a/12505517/2661831

Я все еще хотел бы знать, есть ли способ сортировать такие строки:

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
person Josiah    schedule 15.08.2014
comment
что-то вроде usort($skus, function ($a, $b){return strcmp(substr($a, 0, strpos($a, "=")),substr($b, 0, strpos($b, "=")));}); должно работать для вас. - person Orangepill; 15.08.2014