Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Сортировка ключей масива по алфовиту с учетом цифр


Автор: chiffa 14.3.2011, 18:59
Добрый день. Есть массив в 

a1
a3
a2
a10
b2
b1
b11

при использовании ksort результат получается Что по сути есть логичным, с точки зрения программы...

a1
a10
a2
a3
b1
b11
b2

А как получить "правильный" отсортированный список?... то есть

a1
a2
a3
a10
b1
b2
b11

Заранее спасибо за помощь!

Автор: ksnk 14.3.2011, 19:43
Код

$ar=array('a1',
'a3',
'a2',
'a10',
'b2',
'b1',
'b11');

function cmp($a,$b){
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

function sortarray($a, $b){
  if(preg_match('/(\D*)(\d*)/',$a,$ma))

     if(preg_match('/(\D*)(\d*)/',$b,$mb)) {
        $res=cmp($ma[1],$mb[1]);
        if($res==0)
            return cmp($ma[2],$mb[2]);
        else 
            return $res;
  }
  return cmp($a,$b);
}


usort($ar,sortarray);
print_r($ar);

как-то так.

Добавлено через 28 секунд
Хотя, возможно, есть более натуральные сортировки

Автор: Shumomer 14.3.2011, 21:22
natsort($ar); вообще-то smile

Автор: SneG0K 14.3.2011, 23:14
Эммм, вообще-то обычный sort подойдет
Код

$arr = array('m1', 'm3', 'm2', 'm5', 'm1', 'm1');
sort($arr);
var_dump($arr);

Автор: Shumomer 15.3.2011, 00:02
SneG0K, а ты добавь в массив элемент 'm10' (см. условия ТС) и посмотри куда он встанет при обычном sort и куда при natsort

Автор: chiffa 15.3.2011, 01:50
Shumomer, Пасиба! natsort уже близко но все равно как то не так...

[chiffa_0] => 
    [chiffa_1] => 
    [chiffa_2] => 
    [chiffa_3] => 
    [chiffa_4] => 
    [chiffa_6] => 
    [chiffa_9] => 
    [chiffa_27] => 
    [chiffa_28] => 
    [chiffa_29] => 
.....

[chiffa_41] => 
    [chiffa_42] => 
    [chiffa_43] => 
    [chiffa_5] => 
    [chiffa_7] => 
    [chiffa_8] => 
    [chiffa_10] => 

ну и т.д....

Автор: Shumomer 15.3.2011, 14:13
Так вам по значениям или по ключам сортировка-то нужна?

Автор: chiffa 15.3.2011, 16:23
по ключам...

Автор: ksnk 15.3.2011, 17:13
Цитата(chiffa @  15.3.2011,  16:23 Найти цитируемый пост)
по ключам... 

А мой способ чем не подошел?

Автор: chiffa 15.3.2011, 17:41
У тебя почему то выдает...

Notice: Use of undefined constant sortarray - assumed 'sortarray' in /var/www/mess/modules/mes_do.php on line 341


и меняет индекс...

 [0] => 
    [1] => 
    [2] => 
    [3] => 
    [4] => 

Автор: ksnk 15.3.2011, 23:01
Цитата(chiffa @  15.3.2011,  17:41 Найти цитируемый пост)
on line 341

 smile в моем тексте не так много строк.
А если одним файлом мой текст оформить - тоже ругательство будет? У меня - работает
Цитата

Array ( [0] => a1 [1] => a2 [2] => a3 [3] => a10 [4] => b1 [5] => b2 [6] => b11 ) 


а версия php какая? 

Автор: chiffa 16.3.2011, 13:08
ksnk, так разве оно у тебя по ключам сортирует?....

Добавлено через 1 минуту и 48 секунд
пхп 5

Добавлено через 14 минут и 6 секунд
Проблема решена. Может кому то будет полезным. сделал так:

Код

$ar=array('chiffa_0' => '1',
    'chiffa_1' => '2',
    'chiffa_2' => '3',
    'chiffa_4' => '4',
    'chiffa_40' => '5',
    'chiffa_21' => '6',
    'chiffa_93' => '7',
    'chiffa_71' => '8',
    'chiffa_86' => '9',
    'chiffa_29' => '10' );


foreach ($ar as $key=>$value)
{
$arr_for_sort []=$key;
}

natsort ($arr_for_sort);
foreach ($arr_for_sort as $sor_key)
{
$new_arr [$sor_key]=$ar [$sor_key];
}
print_r($new_arr);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)