Отсортировать массив по 5-му символу с конца

P
На сайте с 06.01.2009
Offline
592
779

Привет ребят. Прошу помочь. Думаю для Гуру не будет проблемой, а у меня не получается.

В массиве $galereyafile список файлов.

Можно ли легким способом отсортировать массив по значению 5-го символа (с конца) файла?

Спасибо заранее.

ps. Поясню. В массив записываются названия файлов. Они расположены по алфавиту. Но мне по алфавиту - это самый плохой вариант.

Сделал перемешивание массива перед выводом, но тоже плохо, после каждого запуска скрипта - массив по разному перемешивается (само собой).

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

[umka]
На сайте с 25.05.2008
Offline
456
#1

function cmp($a, $b) {
$a=substr($a,-5,1);
$b=substr($b,-5,1);
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
usort($galereyafile,"cmp");
Лог в помощь!
P
На сайте с 06.01.2009
Offline
592
#2

umka, спасибо, но не получилось.

Все также отсортирован по алфавиту.

Поставил Ваш код вместо shuffle($galereyafile);

Только не смейтесь, если я чего не так понял.

Скрипт у меня на php

[umka]
На сайте с 25.05.2008
Offline
456
#3

А… я не совсем понял задачу. Мой скриптик сортирует массив по 5-му символу с конца строки :)

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

Примерно так

foreach ($galereyafile as $filename) {

$f=fopen($filename,'r');
fseek($f,-5,SEEK_END);
$k=fread($f,1);
fclose($f);
$galereyafile2[$k]=$filename;
}
ksort($galereyafile2);
print_r($galereyafile2);

Тут предполагается, что вы самостоятельно сделаете обработку ошибок, и что не будет двух файлов с одинаковым 5-м символом с конца :)

---------- Добавлено 13.02.2012 в 23:16 ----------

А вообще, если задача отсортировать массив каждый раз одинаково хаотично, то проще не мучить файловую систему, а работать таки с именами файлов.

Примерно так:


foreach ($galereyafile as $filename) {
$galereyafile2[md5($filename)]=$filename;
}
ksort($galereyafile2);
print_r($galereyafile2);

Вместо md5, конечно же, можно (и даже лучше) использовать какую-либо более простую функцию.

P
На сайте с 06.01.2009
Offline
592
#4

umka, не силен в этом. Но насколько я понимаю - fopen - открыть файл.

Файл открывать не надо :)

Есть массив $galereyafile, в нем

$galereyafile[0] - index.php

$galereyafile[1] - lamitat.php

$galereyafile[3] - edilgres.php

и т.д.

и мне надо отсортировать по символу перед точкой (он же пятый символ).

[umka]
На сайте с 25.05.2008
Offline
456
#5
postavkin:
umka, не силен в этом. Но насколько я понимаю - fopen - открыть файл.
Файл открывать не надо :)
Есть массив $galereyafile, в нем
$galereyafile[0] - index.php
$galereyafile[1] - lamitat.php
$galereyafile[3] - edilgres.php
и т.д.
и мне надо отсортировать по символу перед точкой (он же пятый символ).

Значит я вас всё-таки правильно понял, и тогда код из поста №2 должен работать :)

P
На сайте с 06.01.2009
Offline
592
#6
'[umka:
;10041570']

function cmp($a, $b) {
$a=substr($a,-5,1);
$b=substr($b,-5,1);
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
usort($galereyafile,"cmp");

Не работает.

Само собой это в php файле окружено

<?php ?>

P
На сайте с 06.01.2009
Offline
592
#7

Ребят, подскажите, пожалуйста ещё вариант.

Лично у меня предложенный вариант Umka не хочет работать.

Массив каждый раз перемешивается и само собой записи потом выводятся каждый раз по-разному. А мне надо сделать просто вывод массива не по алфавиту, в любом другом варианте, но без сортировки по алфавиту + задача чтобы каждый раз при запуске скрипта не менялось сильно местоположение записей.

[umka]
На сайте с 25.05.2008
Offline
456
#8

У меня работает и вариант из поста №2 (сортирует по 5-му с конца символу), и особенно хорошо работает второй вариант из поста №4 (вообще отсутствуют какие-либо признаки сортировки).

Если у вас не работает, значит в вашем коде, скорее всего, после "хитрой" сортировки есть ещё какие-то действия с этим массивом. Попробуйте мой код сохранить в отдельный файл и вы убедитесь, что всё работает.

P
На сайте с 06.01.2009
Offline
592
#9

Umka, извините, а мне Ваш код (вариант из поста №2 ) не надо в какой нибудь цикл поставить?

Просто после вашего кода ставлю только вывод массива

foreach ($galereyafile as $value) {

выводим value

}

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий