Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Создание древовидного списка из массива

01.05.2011 | Категория: Web-мастеру и не только | Автор: ManHunter
Еще одна из часто встречающихся задач при разработке сайтов - создание многоуровневых древовидных списков. Отдельные элементы списков хранятся в массиве и объединяются между собой через связку полей "ID элемента" - "Родительский элемент". Это могут быть выпадающие меню с несколькими уровнями субменю, каталоги товаров по категориям, карты сайта и т.п. Попробуем описать трехуровневое вложенное меню. Для этого зададим массив вручную, а в реальной ситуации он может быть, например, получен из базы. Количество уровней вложенности может быть произвольным, три уровня выбраны исключительно для примера.
  1. // Построение из массива древовидного списка без использования рекурсии
  2. $menu=array(
  3.      1=>array('name'=>'Овощи''parent'=>0),
  4.          6=>array('name'=>'Капуста''parent'=>1),
  5.          7=>array('name'=>'Помидоры''parent'=>1),
  6.          9=>array('name'=>'Салат''parent'=>1),
  7.              18=>array('name'=>'Китайский салат''parent'=>9),
  8.          12=>array('name'=>'Тыква''parent'=>1),
  9.          16=>array('name'=>'Редиска''parent'=>1),
  10.      2=>array('name'=>'Фрукты''parent'=>0),
  11.          13=>array('name'=>'Бананы''parent'=>2),
  12.          14=>array('name'=>'Ягоды''parent'=>2),
  13.              19=>array('name'=>'Арбуз''parent'=>14),
  14.              20=>array('name'=>'Клубника''parent'=>14),
  15.      3=>array('name'=>'Животные''parent'=>0),
  16.      4=>array('name'=>'Растения''parent'=>0),
  17.          8=>array('name'=>'Конопля''parent'=>4),
  18.          11=>array('name'=>'Мак''parent'=>4),
  19.          17=>array('name'=>'Сахарный тростник''parent'=>4),
  20.      5=>array('name'=>'Насекомые''parent'=>0),
  21.          10=>array('name'=>'Тараканы''parent'=>5),
  22. );
В parent прописан ID родительского элемента для каждого субменю, главное меню (первый уровень) имеет parent=0. Теперь нам надо из этого линейного массива сделать древовидный согласно связям родительских и дочерних элементов. Обычно для этого используется решения с применением рекурсии или же требуется, чтобы исходный массив был специальным образом отсортирован. Но вполне можно обойтись таким вот элегантным решением с использованием ссылок:
  1. // Построение дерева за один проход
  2. foreach($menu as $menu_id=>$data) {
  3.     // Прописать в родительском узле ссылку на пункт меню
  4.     $menu[$data['parent']]['child'][$menu_id]=&$menu[$menu_id];
  5. }
  6.  
  7. // Готовый массив находится в $menu[0]['child']
  8. $sorted_menu=(array)$menu[0]['child'];
Единственное условие, чтобы исходный массив не содержал кольцевых замыканий, это когда родительский элемент ссылается в качестве своего родителя на свой дочерний элемент. Других ограничений нет, массив может быть как угодно отсортирован и иметь "дыры" в нумерации ID.

Читать статью целиком »
Просмотров: 11241 | Комментариев: 11

Выбор случайной строки из таблицы MySQL

20.04.2011 | Категория: Web-мастеру и не только | Автор: ManHunter
Одна из часто встречающихся задач при создании сайтов - выборка случайной строки из таблицы MySQL. Это может быть случайный баннер в ротации, какая-нибудь "фраза дня" или афоризм, промо-блок на главной странице и т.п. Применений масса. Я решил на практике протестировать несколько вариантов решения этой задачи. Исходные данные: база MySQL, таблица типа MyISAM проиндексирована по полю id, количество записей около 500000, поле id обозначено как PRIMARY KEY, в нумерации есть "дырки" из-за удаленных строк.

Переходим к тестированию. Традиционное решение сводится к такому запросу:

SELECT * FROM `table` ORDER BY RAND() LIMIT 1

Код на PHP для тестирования:
  1. // Тест №1
  2. $query="SELECT * FROM `table` ORDER BY RAND() LIMIT 1";
  3. $sql_result=mysql_query($query);
  4. $row=mysql_fetch_array($sql_result);
  5. mysql_free_result($sql_result);
Результаты не радуют. Среднее время выполнения одного такого запроса на моем компьютере занимает 2.5 секунды. На реальном проекте, особенно если он работает под нагрузкой, такие затраты времени недопустимы.

Читать статью целиком »
Просмотров: 14249 | Комментариев: 9

Исследование защиты программы SourceCop

14.04.2011 | Категория: Темная сторона Силы | Автор: ManHunter

Скриншот программы SourceCop

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

Читать статью целиком »
Просмотров: 7044 | Комментариев: 8

Парсер CSV-файла на PHP

04.04.2011 | Категория: Web-мастеру и не только | Автор: ManHunter
В одном из рабочих проектов менеджеры загружают информацию в формате CSV-файлов. Все бы хорошо, но у некоторых на компьютерах установлен Microsoft Office, а у других OpenOffice. И, как выяснилось, при сохранении файлов в формате CSV, получается совершенно разный результат: OpenOffice все без исключения поля заключает в кавычки, а поделка от Microsoft делает это как-то выборочно. В некоторых случаях стандартная функция fgetcsv на таких файлах давала сбой, пришлось рисовать свой аналог.
  1. //------------------------------------------------------------
  2. // Функция парсера CSV-файла
  3. //------------------------------------------------------------
  4. // На входе: $file_name - имя файла для парсинга
  5. //           $separator - разделитель полей, по умолчанию ';'
  6. //           $quote - ограничитель строк, по умолчанию '"'
  7. // На выходе: массив значений всего файла
  8. //------------------------------------------------------------
  9. function fuck_csv($file_name$separator=';'$quote='"') {
  10.     // Загружаем файл в память целиком
  11.     $f=fopen($file_name,'r');
  12.     $str=fread($f,filesize($file_name));
  13.     fclose($f);
  14.  
  15.     // Убираем символ возврата каретки
  16.     $str=trim(str_replace("\r",'',$str))."\n";
  17.  
  18.     $parsed=Array();    // Массив всех строк
  19.     $i=0;               // Текущая позиция в файле
  20.     $quote_flag=false;  // Флаг кавычки
  21.     $line=Array();      // Массив данных одной строки
  22.     $varr='';           // Текущее значение
  23.  
  24.     while($i<=strlen($str)) {
  25.         // Окончание значения поля
  26.         if ($str[$i]==$separator && !$quote_flag) {
  27.             $varr=str_replace("\n","\r\n",$varr);
  28.             $line[]=$varr;
  29.             $varr='';
  30.         }
  31.         // Окончание строки
  32.         elseif ($str[$i]=="\n" && !$quote_flag) {
  33.             $varr=str_replace("\n","\r\n",$varr);
  34.             $line[]=$varr;
  35.             $varr='';
  36.             $parsed[]=$line;
  37.             $line=Array();
  38.         }
  39.         // Начало строки с кавычкой
  40.         elseif ($str[$i]==$quote && !$quote_flag) {
  41.             $quote_flag=true;
  42.         }
  43.         // Кавычка в строке с кавычкой
  44.         elseif ($str[$i]==$quote && $str[($i+1)]==$quote && $quote_flag) {
  45.             $varr.=$str[$i];
  46.             $i++;
  47.         }
  48.         // Конец строки с кавычкой
  49.         elseif ($str[$i]==$quote && $str[($i+1)]!=$quote && $quote_flag) {
  50.             $quote_flag=false;
  51.         }
  52.         else {
  53.             $varr.=$str[$i];
  54.         }
  55.         $i++;
  56.     }
  57.     return $parsed;
  58. }
На входе передаются три параметра: обязательный параметр $file_name - путь к CSV-файлу, необязательные параметры $separator - разделитель значений полей в строке, по умолчанию ';' и $quote - ограничитель текстовых полей, по умолчанию двойная кавычка. На выходе из функции возвращается массив с распарсенными значениями всего файла. Дополнительных проверок на существование файла и корректность его внутреннего формата не производится, можете добавить эти функции самостоятельно. Также теоретически могут возникнуть проблемы с обработкой файлов очень большого объема. На моей практике таких проблем не возникало, так что может быть это решение пригодится кому-нибудь еще.

Просмотров: 13269 | Комментариев: 13

Исследование защиты программы PHP LockIt!

30.01.2011 | Категория: Темная сторона Силы | Автор: ManHunter

Скриншот программы PHP LockIt!

Программа PHP LockIt! предназначена для защиты исходных текстов PHP-скриптов от исследования и модификации. В качестве защиты применяется обфускация имен функций и переменных, а также шифрование исходного кода. В более ранних версиях была еще возможность сжимать полученные скрипты, но разработчики по какой-то причине от этого отказались. Зашифрованные скрипты не требуют установки на сервер дополнительного программного обеспечения, поэтому PHP LockIt! пользуется большой популярностью как у зарубежных, так и у отечественных копирастов. Я давно наблюдаю за развитием этой защиты, и среди других аналогичных поделок она кажется мне наиболее стабильной и надежной. Мне даже довелось встретить китайскую подделку PHP LockIt!, когда интерфейс программы был изменен в редакторе ресурсов, копирайты исправлены на свои, а затем на изуродованный файл был навешан протектор. При этом полученный китайский гибрид позиционировался как авторская разработка и распространялся как самостоятельный продукт с другим названием.

Читать статью целиком »
Просмотров: 9948 | Комментариев: 21

01 ... 15 16 17 18 19 20 21 ... 24
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 3 (0.0089 сек.) / Память: 4.5 Mb
Наверх