Эта тема на forum.dklab.ru


Xoce: Сортировка массива
Есть массив

Array
(
[0] => 4.150.2002.s.jpg
[1] => 5.150.1998.s.jpg
[2] => 2.150.2001.s.jpg
[3] => 1.150.2002.h.jpg
)

Можно ли его отсортировать по году в названи и по букве после года, имеется ввиду "2002.s", а чтобы первые два значения "4.150" в сортировке не учавствовали?
_
Юрий Насретдинов:
Xoce:
Можно, но это будет очень громоздко. Можно конечно еще использовать http://www.php.net/usort , и написать для этого callback-фукнцию, но ИМХО лучше переделать структуру массива так, чтобы его можно было легко сортировать (хотя при небольшом объеме можно и «в лоб»...)
Xoce:
Я тут тоже, вроде, кое что придумал...
Я хочу из этого массива сделать новый массив, например вот такой:

Array
(
[2002] => Array
(
[s] => Array
(
[0] => 4.150.2002.s.jpg
)

[h] => Array
(
[0] => 1.150.2002.h.jpg
)

)

[2001] => Array
(
[s] => Array
(
[0] => 2.150.2001.s.jpg
)

)

[1998] => Array
(
[s] => Array
(
[0] => 5.150.1998.s.jpg
)

)

)


И в дальнейшем работать уже с ним. Потому, что здесь уже все начинает выресовываться так как мне нужно.
Только я пока дальше чем осознание того, что мне нужно никуда не ушел :)
1. В начале нужно правильно сделать обработку каждой записи заданного(первый пост) массива, т.е. распихать все по полочкам.
2. Потом требуется вывести все значение этого нового массива. Не подскажите есть ли такая функция, чтобы выводила все значения многомерного массива?
3. И дальше уже можно просто обрашаться к новому массиву по индексу в нужную ветку.

Вот как я придумал :) правда теперь осталось все это осуществить :)
_
Юрий Насретдинов:
Xoce:
array_multisort
Дмитрий Котеров:
ожно конечно еще использовать http://www.php.net/usort , и написать для этого callback-фукнцию,
Это самый простой способ, кстати.
Кирилл Моисеенков:
Xoce:
Всё равно нужно будет переделывать первый массив до второго программными средствами.
Xoce:
Вот как у меня получилось

foreach($img as $i)
{
$ipath = explode(".", $i);
$img_new[$ipath[2]][$ipath[3]][] = $i;
krsort($img_new); // для чисел
ksort($img_new[$ipath[2]]); // для букв
}

Так будет нормально?
_
Xoce:
Я не понял, честно говоря, как использовать array_multisort() в моем случае...

А что такое callback-фукнция?
_
Юрий Насретдинов:
Xoce:
Только вот зачем в цикле сортировать ?
Xoce:
Чтоб потом отдельно этого не делать :)
_
Юрий Насретдинов:
Xoce:
Ну-ну...
Xoce:
А как?
_
Юрий Насретдинов:
Xoce:
Вынести сортировку из цикла и поместить её в конец.
Xoce:
Но ведь это подойдет только для первого измерения(там где "2002"). А чтобы отсортировать буквы(там где "s") придется делать новый цикл. Я не прав?
_
Юрий Насретдинов:
Xoce:
Делайте как хотите. Если Вы в цикле можете выполнять только 1 операцию, то пожалуйста.
Xoce:
Дело в том, что у меня вариантов не много... Я новичок и никогда раньше не програмировал, поэтому не знаю сколькими способами можно решать эту задачу.
Я Вас и спрашиваю потому, что если Вы знаете как лучше написать мой цикл, то покажите пожалуйста. Только объясните почему у меня не правильно, а у Вас лучше. Я учусь по книжкам, а с нижкой не по дискутируешь... Поэтому я к Вам и пристал, т.к. если цикл написан ирационально, то я этого никогда не узнаю :)

ЗЫ. У меня из знакомых, которые хоть каким-то образом относятся к программированию, есть только этот форум. Просто спросить больше неукого... Обычно на форумах пишут ты лама, иди в гугл. Только на этом форуме меня по дальше не посылают, за что кстати огромное спасибо!
_
Юрий Насретдинов:
Xoce:
Вы, кстати, можете сделать второй массив, оставив от первого только, скажем, год и букву:


foreach($img as $k=>$v)
{
$tmp=explode('.',$v);
$tmp=$tmp[2].'.'.$tmp[3];
$img_new[$k]=$tmp;
}
//**
asort($img_new);


Теперь Вы можете обращаться к массиву $img_new , брать ключи массива из $img_new , а значения подставлять из $img . В любом случае, такой формат хранения данных (как у Вас) не очень удачен...
Xoce:
Спасибо. Ваш вариант интересный. Но он мне функционально не очень подходит. Хотя очень поучительный.

Вся эта муть с сортировкой исходного цикла задумывалась только для того чтобы получить точно такойже цикл, но отсортированный в нужном порядке - сначала шли картинки наиболее раннего года(те четыре цифры это годы). У меня, как не сложно догадаться, это просто массив картинок для галереи, которые я потом буду выводить на страницу. Имена картинок сделаны "говоряшими", чтобы из имени картинки можно было вытаскивать ссответствующие коментарии, но помимо этого имя картинки целиком тоже должно сохраняться, т.к. оно нужно для <img src="">.
А индексы старые мне как раз совсем не нужны, потому, что индексы должны быть обязательно по порядку и начинаться с "0" - это влияет на отображения количества получившихся страниц, в том случае, если обшее количество картинок больше чем может поместиться на одной странице.

Теперь Вы знаете мою ситуацию полностью(кстати я эту галерею уже сделал). Вы считаете, что я храню свои данные не удачно..? А какие же еще есть варианты...?
_
WingedFox:
Xoce:
Так нормально?

usort($a,create_function('$a,$b','$a = explode(".",$a); $b = explode(".",$b); $c=@strcmp($a[2],$b[2]); return $c==0?@strcmp($a[3],$b[3]):$c;'));

Maus:
Раз уж речь зашла о сортировке, несколько дурацкий вопрсо: я правильно понимаю ,что, в силу того, что PHP рассматривает многомерные массивы как вложенные одномерные, в нем нельзя сортировать скажем, такой массив:
1 b 2004
2 a 2003
3 с 2003
по столбцу 2?
WingedFox:
Можно. Не проверял, но работать должно.

usort($a,create_function('$a,$b','return strcmp($a[1],$b[1])'));

Дмитрий Котеров:
Точка с запятой там только нужна в кавычках, по-моему.
Maus:
Дмитрий Котеров:
угу

usort($a,create_function('$a,$b','return strcmp($a["col_4_sort"],$b["col_4_sort"]);'));

а то результат - еще большая мешанина..

WingedFox
Спасибо большое!
WingedFox:
Maus:
Пожалуйста! 8*)
Дмитрий Котеров:
Тема закрыта.

Эта тема на forum.dklab.ru