Заметки о русской литературе, культуре, языке

Как устроена Совотека

О том, что у «Совотеки» под капотом перьями.

У Совотеки все картинки-миниатюры генерируются и хранятся в отдельной папке по адресу:

sovoteka.ru/i/s/

Большие версии тех же картинок хранятся отдельно по адресу:

sovoteka.ru/i/

Всего в «Совотеке» сейчас 903 совы и для удобства каждая картинка подписывается автоматически.

Например, 100-я сова в миниатюрке имеет адрес: sovoteka.ru/i/s/sovoteka_100_s.jpg. У нее всегда размер 95×95 пикселей. Ее увеличенная копия имеет адрес: sovoteka.ru/i/sovoteka_100.jpg. Размер у нее непредсказуем.

Нужно написать такой скрипт на PHP, чтобы он смог проделать следующее:

  • автоматом подсчитать, сколько сов уже есть на сайте (я это делал через переменную, которая считает количество файлов, например, в папке /i/s/. Сколько уменьшенных копий — столько сов на сайте);
  • из множества сов выбрать 50 случайных и вывести их на экран (это можно через генерацию случайных чисел сделать, я их подставлял в имена файлов, ведь в них меняется только число — sovoteka_$chislo_s.jpg, к примеру). Важно, чтобы эти 50 сов не были повторяющимися — с этим проблемы. Случайные совы генерируются каждый раз при обновлении страницы — каждый раз разные картинки.

Результат выполнения PHP-скрипта — HTML-код вида:

<a href="/i/sovoteka_518.jpg"><img src="/i/s/sovoteka_518_s.jpg" width="95" height="95"></a>
<a href="/i/sovoteka_431.jpg"><img src="/i/s/sovoteka_431_s.jpg" width="95" height="95"></a>

Сейчас у меня такой код вышел:

$chislo = sizeof(glob('i/*.*'));
// Подсчитываю, сколько картинок в папке, следовательно столько сов на сайте

$arr = range(1, $chislo);
// Делаю случайное число от 1 до числа сов на сайте

shuffle($arr);
// Мешаю числа

for ($i=0; $i < count($arr); $i+=11) { 
// Зацикливаю вывод

echo '<a class="imgs_group" rel="gal" href="/i/sovoteka_'.$arr[$i].'.jpg">
<img src="/i/s/sovoteka_'.$arr[$i].'_s.jpg" width="95" height="95" class="ingal"></a>';
// Подставляю созданные номера в HTML — костыль, в общем.
}

С наибольшей степенью вероятности могу утверждать, что этот код — костыль. Если у вас есть предложения по решению данной задачи, отпишитесь в комментариях.

Обновление

Спасибо Антону Сюваеву за помощь в коде. Теперь совы генерируются как надо — с выборкой из массива и проверкой на повторы.

$files = glob('i/s/*.jpg');
$rand_keys = array_rand($files, 50); // 50 случайных ключей из массива

foreach ($rand_keys as $pos) {
$thumb_name = $files[$pos];
$full_name = str_replace(array('/s','_s'),'',$thumb_name);

echo '{$thumb_name}\n'; // url мелкого файла
echo '{$full_name}\n\n'; // url крупного файла
}
Поделиться
Отправить
Запинить
1 комментарий
Антон Сюваев 2014

примерно так можно сделать:

$files = glob(’i/s/*.jpg’);
$rand_keys = array_rand($files, 50); // 50 случайных ключей из массива

foreach ($rand_keys as $pos) {
$thumb_name = $files[$pos];
$full_name = str_replace(array(’/s’,’_s’),’’,$thumb_name);

echo «{$thumb_name}\n»; // url мелкого файла
echo «{$full_name}\n\n»; // url крупного файла
}

Константин Когут 2014

Антон, спасибо! Вы просто спаситель Совотеки.