настраиваемый массив сортировки - PullRequest
1 голос
/ 20 февраля 2011
$array = array(
   'list1 - 1',
   'list7 - 1',
   'list5 - 2',
   'list3 - 1'
);

Мне нужно отсортировать этот массив численно. Функция должна проверять значение после знака равенства для сортировки.


Результат:

list1 - 1
list7 - 1
list3 - 1
list5 - 2


В приведенном выше результате, порядок не изменяется ни в алфавитном, ни в числовом виде до list[5]. Как мне это сделать?

Ответы [ 4 ]

3 голосов
/ 20 февраля 2011

создать собственную сортировку и выполнить с помощью функции usort

function mysort($a,$b)
{
    $a = substr($a,-1,1);
    $b = substr($b,-1,1);

    if ($a == $b)
    {
        return 0;
    }

    return ($a < $b) ? -1 : 1;
}

и затем передайте его в usort с вашим массивом следующим образом:

 usort($myarray, "myarray");

-

Вы запрашиваете, что выполнить очень сложно, так как вы хотите отсортировать массив без логического идентификатора, с которым мы работаем, наши умы интерпретируют ваш результат, насколько это возможно, но без создания матрицы, с жестко закодированной концепцией, которую трудно реализовать, лучше всего если класс всегда точно такой же, как выше, то вручную сделайте это:

$temp = $array[3];
$array[3] = $array[4];
$array[4] = $temp;

Ссылка: http://www.php.net/manual/en/function.usort.php

2 голосов
/ 20 февраля 2011

Похоже, вы хотите сначала выполнить поиск по конечным числам, но если они совпадают, то вы хотите сохранить первоначальный порядок элементов. Это означает, что нужно немного больше думать, но работа, по сути, все еще очень проста.

$array = array(
   'list1 - 1',
   'list7 - 1',
   'list5 - 2',
   'list3 - 1',
);

function sort_list(&$subject) {
    // Get an array of the trailing numbers to use within the callback
    $nums = preg_replace('/^.* - (\d+)$/', '$1', $subject);
    // Sort values by trailing number or key
    uksort($subject, function($a,$b) use ($nums) {
        // If numbers are the same, sort by key
        if ($nums[$a] === $nums[$b]) {
            return $a - $b;
        }
        // Othwerise sort by numbers
        return $nums[$a] - $nums[$b];
    });
}

sort_list($array);
var_dump($array);

Выводит что-то вроде:

array(4) {
  [0]=>
  string(9) "list1 - 1"
  [1]=>
  string(9) "list7 - 1"
  [3]=>
  string(9) "list3 - 1"
  [2]=>
  string(9) "list5 - 2"
}
1 голос
/ 20 февраля 2011

Где $array - имя вашего массива. Эта функция работает, если числа больше 1 цифры.

function custom_sort($a, $b)
{
   $exp = '/(\d+)$/';
   preg_match($exp, $a, $a);
   preg_match($exp, $b, $b);
   return intval($a[1]) - intval($b[1]);
}

usort($array, 'custom_sort');
0 голосов
/ 20 февраля 2011
function mySort($array) {
    foreach ($array as $key => $value)  {  
        $array[$key] = explode(" - ", $array[$key]);
        $data[$value] = $array[$key][1];
    }
    asort($data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...