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.

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

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

20.04.2011 | Категория: Web-мастеру и не только | Автор: ManHunter

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

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

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

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

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

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

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

Читать статью целиком »
Просмотров: 7555 | Комментариев: 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 - ограничитель текстовых полей, по умолчанию двойная кавычка. На выходе из функции возвращается массив с распарсенными значениями всего файла. Дополнительных проверок на существование файла и корректность его внутреннего формата не производится, можете добавить эти функции самостоятельно. Также теоретически могут возникнуть проблемы с обработкой файлов очень большого объема. На моей практике таких проблем не возникало, так что может быть это решение пригодится кому-нибудь еще.

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

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

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

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

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

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

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