2013-06-22 3 views
-1

У меня проблема с обработкой более длинных массивов PHP через функцию usort(). Я хочу отсортировать массив с 40-50 элементами типа «1.1», «2.3», «1.1.2», «3.1», 30, «3.10» ... Если я исхожу всего несколькими элементами, все работает хорошо. Но если у меня есть массив из 40 элементов, функция просто слишком медленно - так медленно, что даже перекрывает таймаут 90 сек ...PHP - функция usort слишком медленная

Мой код:

function mySort($a,$b) { 
    $a_arr = explode(".",$a); 
    $b_arr = explode(".",$b); 

    if ($a_arr[0] < $b_arr[0]) {return -1;break;} 
    if ($a_arr[0] > $b_arr[0]) {return 1;break;} 

    for($i=0;$a_arr[$i]==$b_arr[$i];$i++){ 
     if ($a_arr[$i+1] < $b_arr[$i+1]) {return -1;break;} 
     if ($a_arr[$i+1] > $b_arr[$i+1]) {return 1;break;} 
    } 
    } 

$sort_array = array("1.1","2.3","1.1.2","3.1","30","3.10"); //example, I take this data from the database 

usort($sort_array,"mySort"); 

... Может кто-нибудь Помоги пожалуйста? Можно ли это решить? Любая помощь будет принята с благодарностью.

Заранее спасибо.

+1

именно то, что вы имеете 'break' в там? код уже будет иметь 'return'ed, и перерывы никогда не могут быть выполнены. –

+0

Что такое цикл 'for'? Я не понимаю ... не мог бы вы объяснить, что должен сделать ваш алгоритм сортировки? Поделитесь желаемым выходом. – elclanrs

+1

Не использовал бы version_compare() более эффективный, чтобы этот разбивка на подмассивы –

ответ

1

Ваша петля не выходит, если в массиве есть значения, равные. Добавьте предложение return 0 где-нибудь, чтобы указать, когда два элемента массива равны.

Возможно, это произойдет, если вы отсутствуете из элементов для любого из списка (a, b). Потому что в противном случае вы получите уведомления о доступе к индексам массивов, которые не существуют. (Ваш образец дает одно такое уведомление)

+0

... такая глупая ошибка от меня. Большое спасибо. –

2
function mySort($a,$b) { 
    return version_compare($a,$b); 
} 

$sort_array = array("1.1","2.3","1.1.2","3.1","30","3.10");  
usort($sort_array,"mySort"); 

var_dump($sort_array); 

или даже просто

$sort_array = array("1.1","2.3","1.1.2","3.1","30","3.10");  
usort($sort_array,"version_compare"); 

var_dump($sort_array); 
+0

Yeap. Работает также. Спасибо! –