[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сортировка многомерного массива
simple
Всем привет, как написать callback функцию для usort() чтобы она при сортировки одинаковых значений сохраняла бы их упорядочность.
функция типа

function a_sort($a,$b){
if ($a[0] > $b[0])
return 1;
else if ($a[0] < $b[0])
return -1;
else return 0;
}

не помогает, в инете пишут про usort() и пользовательскую сортировку следующее:

Замечание: Если два элемента исходного массива равны, их порядок в отсортированном массиве неопределён. До PHP 4.0.6 пользовательские функции сохраняли для таких элеменов порядок в оригинальном массиве, но новый алгоритм сортировки, появившейся в версии 4.1.0 больше не использует это решение и не имеет другого эффективного.

Неужели ничего нельзя сделать?

Написал свою функцию, которая сортирует одинаковые значения массива поупорядочности которая была до сортировки, все работает как часы, но очень медленно( массив из 5000 записей сортирует 20 сек), вероятно из-за вложенных циклов for...

a[0] = array(12565,0,1);
$a[1] = array(12477,0,2);
$a[2] = array(12843,0,3);
$a[3] = array(12565,0,4);
$a[4] = array(12305,0,5);
$a[5] = array(12565,0,6);
$a[6] = array(12305,0,7);
$a[7] = array(12305,0,8);
$a[8] = array(12565,0,9);
$a[9] = array(12565,0,10);
$a[10] = array(12477,0,11);
//--------------------------------------
$a[5000] = array(12843,0,5001);
array_revers($a);
for($i=0;$i<sizeof($a);$i++){
for($j=$i;$j<sizeof($a);$j++){
if($a[$i][0]>=$a[$j][0]){
$b[0]=$a[0+$i][0];
$b[1]=$a[0+$i][1];
$b[2]=$a[0+$i][2];
$a[0+$i][0]=$a[$j][0];
$a[0+$i][1]=$a[$j][1];
$a[0+$i][2]=$a[$j][2];
$a[$j][0]=$b[0];
$a[$j][1]=$b[1];
$a[$j][2]=$b[2];}}}
for($i=0;$i<sizeof($a);$i++){
echo $a[$i][0].' '.$a[$i][1].' '.$a[$i][2]."<br>";
}

подскажите кто знает как эту проблему рещить? sad.gif



Спустя 9 минут, 49 секунд (6.10.2010 - 17:32) vasa_c написал(а):
я вам ответил на php.ru, вы проигнорировали

Спустя 2 минуты, 32 секунды (6.10.2010 - 17:34) simple написал(а):
было бы неплохо пример увидеть huh.gif

Спустя 3 минуты, 39 секунд (6.10.2010 - 17:38) vasa_c написал(а):
банально влом...
добавьте к массивам ещё элемент - индекс в массиве и используйте его в usort, если основные значения равны.

Спустя 44 секунды (6.10.2010 - 17:39) vasa_c написал(а):
Что за третий элемент в массиве? Он так и растёт?

Спустя 1 минута, 21 секунда (6.10.2010 - 17:40) simple написал(а):
это уже получиться 3 мерный массив что ли? что то я не догоняю blink.gif

3 элемент в массиве это нумерация записей...т.е в какой очередности они попали в массив

Спустя 10 минут, 22 секунды (6.10.2010 - 17:51) simple написал(а):
я еще не могу догнать как в usort все это добро поместить ведь вроде она принимает тока 3 значения 1, -1 и 0

Спустя 1 минута, 40 секунд (6.10.2010 - 17:52) vasa_c написал(а):
ну так эту нумерацию и используйте.

function a_sort($a,$b) {
if ($a[0] > $b[0]) {
return 1;
} elseif ($a[0] < $b[0]) {
return -1;
} elseif ($a[2] > $b[2]) {
return 1;
} elseif ($a[2] < $b[2]) {
return -1;
} else {
return 0;
}
}


Спустя 5 минут, 36 секунд (6.10.2010 - 17:58) simple написал(а):
Вася вы гений, большое тебе человеческое спасибо, усе работает как надо biggrin.gif

Спустя 8 часов, 59 минут, 38 секунд (7.10.2010 - 02:57) SlavaFr написал(а):
a от куда берется масив из 5000 элементов?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.