Помогите с пользовательской сортировкой в ​​php - PullRequest
4 голосов
/ 05 ноября 2010

я пытаюсь отсортировать массив, например

$arr =('1000'=>'DUMMY',
       '100001'=>'DUMMY1',
       '100002'=>'DUMMY3',
       '100004'=>'DUMMY4',
       '1001'=>'TEST',
       '100100'=>'test1',
       '100102'=>'DUMMY123');

после сортировки результат должен выглядеть следующим образом

'1000'=>'DUMMY'
'100001'=>'DUMMY1'
'100002'=>'DUMMY3'
'100004'=>'DUMMY4'
'1001'=>'TEST'
'100100'=>'test1'
'100102'=>'DUMMY123'

значения и ключи должны быть строками.

Любая помощь? Большое спасибо

******* UPDATE *** ** **** 1024 1025 * Ну, наверное, меня неправильно поняли. Я постараюсь дать более подробную информацию.

Пользователь вводит два поля (обе строки). Первый номер числовой, а второй буквенно-цифровой. Таким образом, вышеупомянутый массив создается. Первое поле относится к (уникальному) идентификатору, а второе - к описанию этого идентификатора.

Идентификаторы следуют этому шаблону:

Есть несколько "базовых" идентификаторов, состоящих из 4 цифр. Давайте назовем их «категориями». Эти идентификаторы анализируются для некоторых других идентификаторов (подкатегорий). Каждая подкатегория имеет две цифры, которые мы добавляем в конец идентификатора категории. Пример:

10.00 (cars)
  10.00.01 (blue cars)
    10.00.01.01 (blue cars, trucks)
    10.00.01.02 (blue cars, buses)
10.00.02 (red cars)
   10.00.02.01 (red cars, trucks)

.... и т.д.

пользователи добавляют / редактируют / удаляют категории / подкатегории. Нужно получить отсортированный массив, такой как пример.

Любая помощь?

Большое спасибо

Ответы [ 3 ]

1 голос
/ 05 ноября 2010

Вы знали, что PHP имеет отличную документацию?Взгляните на asort.Если вам нужно сделать сравнение без учета регистра, вам может понадобиться uasort.

0 голосов
/ 09 ноября 2010

asort () должна работать независимо от того, сколько дополнительных 2-символьных подкатегорий вы добавите. С флагом SORT_STRING категория даже не должна быть строкой.

$arr =('100001'=>'DUMMY1',
       '1000'=>'DUMMY',
       '1001'=>'TEST',
       '100002'=>'DUMMY3',
       '100004'=>'DUMMY4',
       '100102'=>'DUMMY123',
       '100100'=>'test1');

asort($arr, SORT_STRING);

Должно привести к

$arr =('1000'=>'DUMMY',
       '100001'=>'DUMMY1',
       '100002'=>'DUMMY3',
       '100004'=>'DUMMY4',
       '1001'=>'TEST',
       '100100'=>'test1',
       '100102'=>'DUMMY123');
0 голосов
/ 05 ноября 2010

Я не совсем понимаю, что вы хотите.
Но я думаю, что-то вроде этого:

это сортировка массива

1st : by the first 4 digits of the key
2nd : by the last 2 digits if they're present


$arr = array(
    '100102'  => 'DUMMY123',
    '100100'  => 'test1',
    '1000'    => 'DUMMY',
    '100004'  => 'DUMMY4',
    '100001'  => 'DUMMY1',
    '100002'  => 'DUMMY3',
    '1001'    => 'TEST',
);

function mysort($a, $b) {
    preg_match('/^(\d{4})(\d\d)?$/', $a, $ma);
    preg_match('/^(\d{4})(\d\d)?$/', $b, $mb);

    if ($ma[1] == $mb[1]) {
        if (!isset($ma[2])) $ma[2] = '';
        if (!isset($mb[2])) $mb[2] = '';
        return strcmp($ma[2], $mb[2]);
    }
    return strcmp($ma[1], $mb[1]);
}
uksort($arr, 'mysort');
print_r($arr);

Выход:

Array
(
    [1000] => DUMMY
    [100001] => DUMMY1
    [100002] => DUMMY3
    [100004] => DUMMY4
    [1001] => TEST
    [100100] => test1
    [100102] => DUMMY123
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...