Большой Воронежский Форум
» Программирование>Отсортировать массив.
Коварный план 17:52 30.07.2008
Никак не вдупляю по какому алгоритму отсортировать массив след. образом.

исходный массив:
индекс -значение
0 -3
4 -4
5 -1
16 -1
18 -2
26 -2
133 -1
421 -1


результат:
индекс -значение
1 -4
2 -0
3 -18
4 -26
5 -5
6 -16
7 -133
8 -421

Т.е. отсортировать индексы исходного массива по их значениям и переписать эти индексы в новый массив в качестве значений. Язык php, но главное сам алгоритм. [Ответ]
mikе 18:48 30.07.2008
$k_array=array_keys($src_array);
sort($k_array); [Ответ]
Коварный план 19:49 30.07.2008
Немного не то. В общем есть таблица в 3 столбца


В итоге нужен массив, в котором сначала стоят наиболее часто встречающиеся элементы.
т.е. 4, 0, 18, ...
[Ответ]
mikе 19:59 30.07.2008

Сообщение от Коварный план:
Т.е. отсортировать индексы исходного массива по их значениям и переписать эти индексы в новый массив в качестве значений. Язык php, но главное сам алгоритм.

Сообщение от Коварный план:
В итоге нужен массив, в котором сначала стоят наиболее часто встречающиеся элементы.

ты уж определись, что нужно ))) [Ответ]
Коварный план 20:04 30.07.2008
Суть не меняется). Расставить значения в порядке их повторяемости. [Ответ]
dn2k4 20:06 30.07.2008
mikе, нет =)

Если устроит, возможно, неустойчивая сортировка, то:

Сообщение от :
arsort($src_array);
$res_array = array_keys($src_array);

или иначе, то что-то в духе:

Сообщение от :
asort($src_array);
$res_array = array_keys($src_array);
$res_array = array_reverse($res_array);

[Ответ]
Коварный план 20:14 30.07.2008
dn2k4, не подходит.

Задача минимум) из
26, 4, 18, 4, 26 , 5, 0, 0, 0, 4, 18, 16, 133, 4, 421

сделать
4, 0, 18, 26, 5, 16, 133 ,421 [Ответ]
dn2k4 20:16 30.07.2008
Коварный план, ты условия на ходу не меняй, да? =) индексы куда дел? [Ответ]
dn2k4 20:19 30.07.2008
$src_array = array(0=>3, 4=>4, 5=>1, 16=>1, 18=>2, 26=>2, 133=>1, 421=>1);
var_dump($src_array);

asort($src_array);
$res_array = array_keys($src_array);
$res_array = array_reverse($res_array);

var_dump($res_array);
-----------------------------------------

array(8) { [0]=> int(3) [4]=> int(4) [5]=> int(1) [16]=> int(1) [18]=> int(2) [26]=> int(2) [133]=> int(1) [421]=> int(1) }
array(8) { [0]=> int(4) [1]=> int(0) [2]=> int(18) [3]=> int(26) [4]=> int(5) [5]=> int(16) [6]=> int(133) [7]=> int(421) }

=) [Ответ]
Коварный план 20:21 30.07.2008
Просто с индексами, это я вес присваивал)
т.е. читаю из базы первое число 26 и в массив в 26 элемент пишу +1

В итоге массив
индекс значение
4 4
0 3
26 2 [Ответ]
Коварный план 20:22 30.07.2008
dn2k4, блин), может подскажешь просто

из
26, 4, 18, 4, 26 , 5, 0, 0, 0, 4, 18, 16, 133, 4, 421

сделать
4, 0, 18, 26, 5, 16, 133 ,421
? [Ответ]
dn2k4 20:32 30.07.2008
хи =) борьба слепого с глухим =)

Все ты правильно делаешь - создаешь $src_array, где индекс===число из последовательности, а элемент - количество появлений. Потом сортируешь с сохранением индексов и после этого значения массива ключей-индексов и будет тем что ты хочешь.

UPD: я ж в примере нарисовал - на значения массива-результата посмотри... [Ответ]
Коварный план 20:39 30.07.2008
dn2k4, спасибо тебе добрый человек, всё получилось) [Ответ]
mikе 21:06 30.07.2008
dn2k4, а нафига асорт, в первом случае ассоциации с индексами нафих не нужны (насколько я понял, по крайней мере) [Ответ]
dn2k4 21:24 30.07.2008
mikе, чистая телепатия =) По первому примеру - там да, то что написано, противоречит тому, что в примере получения... А так - ему индексы, собсно, как уникальные ключи и нужны, их терять нельзя. Я, правда, вначале тоже думал, что можно какой-нить array_flip сделать, а потом сообразил, что если два одинаковых значения массива на разных ключах будут, то что-то тут не так... [Ответ]
mikе 21:27 30.07.2008
dn2k4, [Ответ]
Вверх