Страница 1 из 1

Сортировка элементов массива

СообщениеДобавлено: Сб май 10, 2008 11:15
Padonak
Возможно вопрос тупой но не получается сортировка. интересно то что она происходит но результат не тот какой хочется получить. итак есть массив вида:

Код: Выделить всё
var picArray = new Array(
{ttl:"red_pepper", pic:"red_pepper_04.jpg"},
{ttl:"zolushka", pic:"zolushka_1.jpg"},
{ttl:"zolushka", pic:"zolushka_6.jpg"},
{ttl:"dimiz", pic:"dimiz_01.jpg"},
{ttl:"dimiz", pic:"dimiz_02.jpg"},
{ttl:"dimiz", pic:"dimiz_03.jpg"},
{ttl:"muromec", pic:"muromec_06.jpg"},
{ttl:"zolushka", pic:"zolushka_5.jpg"},
{ttl:"zolushka", pic:"zolushka_2.jpg"},
{ttl:"zolushka", pic:"zolushka_3.jpg"},
{ttl:"kabelina", pic:"kabelina_03.jpg"},
{ttl:"zolushka", pic:"zolushka_4.jpg"},
{ttl:"zolushka", pic:"zolushka_7.jpg"},
{ttl:"red_pepper", pic:"red_pepper_01.jpg"},
{ttl:"red_pepper", pic:"red_pepper_02.jpg"},
{ttl:"zolushka", pic:"zolushka_8.jpg"},
{ttl:"zolushka", pic:"zolushka_9.jpg"},
{ttl:"fealko", pic:"fealko_01.jpg"},
{ttl:"panzir", pic:"panzir_05.jpg"},
{ttl:"panzir", pic:"panzir_04.jpg"},
{ttl:"panzir", pic:"panzir_02.jpg"},
{ttl:"panzir", pic:"panzir_01.jpg"},
{ttl:"muromec", pic:"muromec_05.jpg"},
{ttl:"fealko", pic:"fealko_02.jpg"},
//... и т.д.
{pic:"", ttl:""}
);


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

Код: Выделить всё
function buildList(){
// обрезается последний элемент массива т.к. он пустой и
// используется только как средство борьбы с последней
// ненужной запятой - короче то не имеет отношения к вопросу
picArray.pop();


// теперь вродекаг должна быть сортировка
// которая не происходит нужным образом
picArray.sort();


// дальше - построение списка ссылок
// которое видимо не имеет отношения к вопросу тоже
var menu = document.getElementById("menu");
for(var i = 0; i < picArray.length; i++){
var pic = picArray[i]["pic"];
var ttl = picArray[i]["ttl"];
var lnk = document.createElement("a");
lnk.setAttribute("href","#null");
lnk.innerHTML = ttl;
lnk.onfocus = function(){this.blur();};
eval("lnk.onclick = function(){showPic('" + pic + "');}");
menu.appendChild(lnk);
var br = document.createElement("br");
menu.appendChild(br);

}
if(menu.offsetHeight > parseInt(document.body.clientHeight*0.8)){
menu.style.height = parseInt(document.body.clientHeight*0.8) + "px";
menu.style.overflow = "auto";
}
menu.style.top = parseInt(document.body.clientHeight/2 - menu.offsetHeight*0.5) + "px";
}


вопрос: как правильно пересортировать массив?

СообщениеДобавлено: Сб май 10, 2008 12:12
Muerto
Рекурсивно обежать уже отсортированный по никам массив. Но это будет небыстрая функция. Написать?

СообщениеДобавлено: Сб май 10, 2008 12:47
Padonak
2Muerto: напиши конечно попробую чо будет

СообщениеДобавлено: Сб май 10, 2008 13:04
Muerto
А можно в два массива разнести. Использовать sort() на оба. А потом их объеденить.

СообщениеДобавлено: Сб май 10, 2008 13:05
Padonak
а совпадет потом?

СообщениеДобавлено: Сб май 10, 2008 13:06
Padonak
в справочнике я читал что в sort() мжно как аргумент передавать функцию для определенной сортировки... но что в ней написать в той ф-ции?

СообщениеДобавлено: Сб май 10, 2008 19:30
Muerto
2Padonak: Протрезвею - посмотрю...

СообщениеДобавлено: Сб май 10, 2008 19:57
Padonak
2Muerto: да када ж я уже пакончу с тваим пагубным пристрастием к спиртному -12-

СообщениеДобавлено: Вс май 11, 2008 19:45
Padonak
Итак пешу аччот

возможно тем кто хорошо владеет пхп это все не будет очень интересно но для таких имбицилов как я - инфа довольно полезная.

у меня изначально было подозрение что подобную сортировку лучше всего делать срецтвами пхп потому что там куча ф-ций для этого предназначенных. этот javascript-массив который я тут приводил в самом начале формируется в башке документа при помощи пхп путем считывания файлов из заданной директории с учетом их расширения. когда мои надежды на легкую сортировку срецтваме javascript не оправдались я задумался о том как же получить уже отсортированный в нужном виде массив javascript. не буду излагать мучительно тупую цепь моих рассуждений. скажу лишь что после того как я привлек к этой тупой проблеме двух таких ушлых камрадов как Скай и Алкипер решение было найдено в течение одной минуты. теперь привожу код для тех кому такое может пригодица:

Код: Выделить всё
<?php
echo'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Тайтл</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta http-equiv="imagetoolbar" content="no">
<link rel="StyleSheet" type="text/css" href="css/style.css">';
// это регвыражение предназначено для того чтобы
// отсекать часть названия файла с цифрами и нижним подчеркиванием
// с целью оставить только слово
$pattern = "/[_]*[\d]/";
// начинаем считывать файлы из директории "pixx"
// пропуская все файлы которые не имеют расширения "jpg"
$dir = opendir("pixx");
while(($file = readdir($dir)) !== false){
if(substr("$file", -3) != "jpg"){continue;}
else{
$temp_ttl = substr("$file", 0, -4);
$ttl = preg_replace($pattern, "", $temp_ttl);
// заносим в массив $arrContent все что нам нужно(часть слова без цифр, src картинки, то что потом станет всплывающей подсказкой)
$arrContent[]= "\n{ttl:\"$ttl\", pic:\"$file\", tip:\" смотреть $temp_ttl \"},";
}
}
closedir($dir);
// теперь нам надо прописать в голову документа javascript-массив
// состоящий из отсортированных натуральным образом членов пхп-массива $arrContent
echo'<script language="JavaScript" type="text/javascript">
<!--
var picArray = new Array(';

// natsort сортирует члены массива таким образом как их мог бы
// отсортировать человек
natsort($arrContent);
// теперь тупо печатаем члены отсортированного натуральным образом пхп-массива
foreach($arrContent as $val) echo $val;

echo'
// дописываем последний член javascript-массива который нужен только для того
// чтобы после него не было запятой которая у нас имеется во всех предыдущих
// позже этот последний ненужный член javascript-массива легко
// убрать использовав pop()
{pic:"", ttl:"", tip:""}
);

var howmuchPix = '.count($arrContent).';
//-->
</script>
<script language="JavaScript" type="text/javascript" src="js/newscript.js"></script>
</head>
<body onload="buildList()">';
?>


в результате всех этих замысловатых мастурбаций вместо javascript-массива приведенного в моем самом первом посте получился вот такой массив:

Код: Выделить всё
<!--
var picArray = new Array(
{ttl:"anhele", pic:"anhele_01.jpg", tip:" сматреть anhele_01 "},
{ttl:"anhele", pic:"anhele_02.jpg", tip:" сматреть anhele_02 "},
{ttl:"anhele", pic:"anhele_03.jpg", tip:" сматреть anhele_03 "},
{ttl:"dimiz", pic:"dimiz_01.jpg", tip:" сматреть dimiz_01 "},
{ttl:"dimiz", pic:"dimiz_02.jpg", tip:" сматреть dimiz_02 "},
{ttl:"dimiz", pic:"dimiz_03.jpg", tip:" сматреть dimiz_03 "},
{ttl:"el_paskudo", pic:"el_paskudo_01.jpg", tip:" сматреть el_paskudo_01 "},
{ttl:"el_paskudo", pic:"el_paskudo_02.jpg", tip:" сматреть el_paskudo_02 "},
{ttl:"el_paskudo", pic:"el_paskudo_03.jpg", tip:" сматреть el_paskudo_03 "},
{ttl:"el_paskudo", pic:"el_paskudo_04.jpg", tip:" сматреть el_paskudo_04 "},
{ttl:"fealko", pic:"fealko_01.jpg", tip:" сматреть fealko_01 "},
{ttl:"fealko", pic:"fealko_02.jpg", tip:" сматреть fealko_02 "},
{ttl:"fealko", pic:"fealko_03.jpg", tip:" сматреть fealko_03 "},
{ttl:"fealko", pic:"fealko_04.jpg", tip:" сматреть fealko_04 "},
{ttl:"fealko", pic:"fealko_05.jpg", tip:" сматреть fealko_05 "},
{ttl:"fealko", pic:"fealko_06.jpg", tip:" сматреть fealko_06 "},
{ttl:"fealko", pic:"fealko_07.jpg", tip:" сматреть fealko_07 "},
{ttl:"fealko", pic:"fealko_08.jpg", tip:" сматреть fealko_08 "},
{ttl:"fealko", pic:"fealko_09.jpg", tip:" сматреть fealko_09 "},
.... и т.д.
{pic:"", ttl:"", tip:""}
);


этот массив уже вполне удобен для создания списка пользователей в алфавитном порядке с учетом расположения по возрастанию src их фоток.

результат работы всей этой лабуды можно увидеть вот тут

за сим откланиваюсь. -03-

п.с. кстати если Муерта вдруг не прочитает это а протрезвев сперва сделает свой вариант решения то интересно было бы посмотреть.

СообщениеДобавлено: Пн май 12, 2008 16:52
Muerto
2Padonak: Увы, я прочитал это раньше, чем протрезвел и забил на это.
Кстати, я бы не откидывал все картинки кроме jpg. Кои могут быть и jpeg и JPG.
Лучше тип файла отсеевать.
Код: Выделить всё
if (exif_imagetype('$file') != IMAGETYPE_JPEG) {continue;}

А ваще, работает - и хорошо.

СообщениеДобавлено: Пн май 12, 2008 23:20
Padonak
2Muerto: ну да ты все правильно говоришь просто я туда картинки пихаю сам вручную и я знаю что они все будут jpg :-)

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

СообщениеДобавлено: Вт май 13, 2008 10:44
Muerto
Padonak писал(а):кстати я могу все это хозяйство отдать под галеру для форума тока кладите на этом серваке. я там меню немного усовершенствовал. можно и поиск сделать - джаваскриптовский будет быстро работать я думаю. там ведь и БД не надо. конечно монстры типа тебя илле всем тут известных чудовищ могут усовершенствовать галеру - там есть где применить фантазию. если надо - скажите я скрипты все отдам.

А кто-то (не будем показывать пальцем) ведь обещал чуть ли не к новому году прошедшему новый вариант mweb выложить... -03-

СообщениеДобавлено: Вт май 13, 2008 12:58
Padonak
2Muerto: да кто-то работает видать много и некогда ему - чо уж его пинать. он и тут редок стал - сиранет чонить и пропадает надолго. а все это я тебе хочу сказать знаешь почему? -12- АТВОТКЕ! -12-

-13- -13- -13-