Array functions

Магические константы

В PHP существует множество магических констант, таких как номер текущей строки (__LINE__), путь к файлу (__FILE__), путь к каталогу (__DIR__), имя функции (__FUNCTION__), имя класса (__CLASS__), имя метода (__METHOD__) и пространства имён (__NAMESPACE__).


Все мы их рассматривать не будем. Посмотрим только лишь парочку:

// этот скрипт зависит от текущего расположения файла и
// может вызвать проблемы, если его использовать из разных дирректорий
require_once('config/database.php');

// этот скрипт не вызовет проблем
require_once(dirname(__FILE__) . '/config/database.php');

Используйте __LINE__ при отладке скриптов:

// код
// ...
my_debug("some debug message", __LINE__);
/* выведет
Line 4: some debug message
*/

// ещё код
// ...
my_debug("another debug message", __LINE__);
/* выведет
Line 11: another debug message
*/

function my_debug($msg, $line) {
	echo "Line $line: $msg\n";
}

Поиск данных: find(), findOne(), findAll()

Если вы не знаете идентификатор бина, вы можете искать бины, используя метод :

$min_price = 250;
$books = R::find('book', 'price > ?', );

$search = 'строка';
$books = R::find('book', 'author LIKE ?', );

$id = 1;
$min_price = 300;
$books = R::find('book', 'id > :id AND price < :price', );

$ids = ;
$books = R::find('book', 'id IN (' . R::genSlots($ids) . ')', $ids);

Если необходимо получить только одну запись, используем метод :

$id = 1;
$book = R::findOne('book', 'id = ?', );

$title = 'гостья из будущего';
$book = R::findOne('book', 'title = ?', );

Если необходимо получить все данные без особых условий, используем метод :

$books = R::findAll('book');

$limit = 5;
$books = R::findAll('book', 'ORDER BY id ASC LIMIT ?', );

Описание

void print_r (mixed expression)

print_r() выводит пригодную для чтения человеком информацию о переменной. Если задано string, integer или float, печатается само значение. Если задан array, значения будут представлены в формате с показом ключей и элементов. Аналогичная нотация используется для object.

Помните, что print_r() перемещает указатель массива в конец. Используйте reset() для возврата его в начало.

выдаст на выводе:

Array
(
  => apple
  => banana
  => Array
 (
  => x
  => y
  => z
 )
)

Эмулятор функции print_r

Этот пример эмуляции функции print_r позволяет не только вывести содержимое массива включая вложенные массивы, но и сформировать строку.

Усложненный вариант функции print_r

При выводе делаются отступы и производится преобразование utf-8 в win1251

Описание на ru2.php.netОписание на php.ru

Сжатие строк

Кода мы говорим о сжатии, то на ум сразу же приходят архивные файлы в формате ZIP. PHP предоставляет возможность сжатия длинных строк без всяких файлов.

В следующем примере продемонстрируем работу функций gzcompress() и gzuncompress():

$string =
"Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nunc ut elit id mi ultricies
adipiscing. Nulla facilisi. Praesent pulvinar,
sapien vel feugiat vestibulum, nulla dui pretium orci,
non ultricies elit lacus quis ante. Lorem ipsum dolor
sit amet, consectetur adipiscing elit. Aliquam
pretium ullamcorper urna quis iaculis. Etiam ac massa
sed turpis tempor luctus. Curabitur sed nibh eu elit
mollis congue. Praesent ipsum diam, consectetur vitae
ornare a, aliquam a nunc. In id magna pellentesque
tellus posuere adipiscing. Sed non mi metus, at lacinia
augue. Sed magna nisi, ornare in mollis in, mollis
sed nunc. Etiam at justo in leo congue mollis.
Nullam in neque eget metus hendrerit scelerisque
eu non enim. Ut malesuada lacus eu nulla bibendum
id euismod urna sodales. ";

$compressed = gzcompress($string);

echo "Original size: ". strlen($string)."\n";
/* выведет
Original size: 800
*/

echo "Compressed size: ". strlen($compressed)."\n";
/* выведет
Compressed size: 418
*/

// возвращаем
$original = gzuncompress($compressed);

В наших силах уменьшить объём текста на 50%. В этих же целях можно использовать методы gzencode() и gzdecode(), которые используют другой алгоритм сжатия.

Выполнить перед завершением

В PHP существует функция register_shutdown_function(), которая позволит вам выполнить какой-то код перед завершением работы скрипта.

Допустим, вы хотите узнать какую-то информацию… Время работы скрипта:

// получаем время начала
$start_time = microtime(true);

// какие-то операции
// ...

// выводим время работы
echo "execution took: ".
		(microtime(true) - $start_time).
		" seconds.";

На первый взгляд это может показаться тривиальной задачей. Для этих целей, вы можете поместить код в конце файла. Однако если перед этим где-то сработает функция exit(), этот код никогда не сработает. Так же, он не сработает если на странице будет ошибка или пользователь прервёт загрузку страницы (нажав на соответствующую кнопку в своём браузере);

При использовании метода register_shutdown_function() код выполнится в любом случае:

$start_time = microtime(true);

register_shutdown_function('my_shutdown');

function my_shutdown() {
	global $start_time;

	echo "execution took: ".
			(microtime(true) - $start_time).
			" seconds.";
}

Создаем файловую структуру сайта:

Файлы:

  • index.php
  • .htaccess

.htaccess OpenServer

DirectoryIndex index.php

AddDefaultCharset utf-8

RewriteEngine on
RewriteBase /
RewriteRUle ^(.*)$ index.php

index.php

<?php

// FRONT COTROLLER

// 1. Общие настройки

ini_set('display_errors', 1);
error_reporting(E_ALL);

// 2. Подключение файлов системы

define('ROOT', dirname(__FILE__));
require_once(ROOT.'/components/Router.php');

// 3. Установка соединения с БД


// 4. Вызов Router

$router = new Router();
$router->run();

В общих настройках мы задали отображение ошибок. Это нужно нам. но не посетителям, поэтому при завершении работ с сайтом, отладке и размещении на хосте, эти строки нам нужно будет изменить. Эта информация может испугать законопослушных и неопытных посетителей сайта, или может быть использована злоумышленниками для взлома сайта.

Для подключения мы используем полный путь на диске, который мы получаем с помощью функции и псевдо константы .

Для проверки содержимого константы ROOT(полный путь от корня файловой системы), мы можем вывести переменную ROOT следующим образом:

ROOT Router.php

define('ROOT', dirname(__FILE__));
require_once(ROOT . '/components/Router.php'); 

еcho ROOT;

Соединения с БД на этом этапе мы выполнять не будем и вернемся к нему позже.

Вызов роутера можно добавить сейчас или сразу после описания нашего ротера я следующем шаге. Он будет заключаться в создании экземпляра класса Роутер — и запуске метода run() — ;

Коль скоро мы подключили файл Router.php, то нам остается его создать в папке components

<?php

class Router {

private $routes;//создаем массив в кот. хранятся наши маршруты

public function __constructor(){

}
public function run() {
    echo "It is file Roter.php";//Это для проверки подключения файла
}
}

Таким образом мы запустили наш Router и передали ему управление

История языка


Изна­чаль­но PHP рас­шиф­ро­вы­вал­ся как Personal Home Page Tools — инстру­мен­ты для созда­ния пер­со­наль­ных стра­ниц. Дело в том, что рань­ше, что­бы сде­лать функ­ци­о­наль­ный сайт, чаще все­го исполь­зо­ва­ли C, Perl и CGI-скрипты. Зву­чит слож­но, на деле — тоже слож­но. Един­ствен­ным спо­со­бом сде­лать что-то своё и не изу­чать при этом три тома по про­грам­ми­ро­ва­нию был PHP.

Язык HTML недо­ста­точ­но гиб­кий и уме­ет не так мно­го, как хоте­лось бы. Раз­ра­бот­чи­ки PHP реши­ли рас­ши­рить воз­мож­но­сти гипер­тек­ста и сде­ла­ли такой язык, кото­рый мож­но встра­и­вать пря­мо в HTML-код, что­бы они рабо­та­ли вме­сте. Для это­го исполь­зу­ют опе­ра­то­ры или или .

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

<?PHP $text_part = «этот код написан на PHP?»; //Задаём строковую переменную и сразу наполняем её текстом ?> <div> <p> Привет! А вы знаете, что <?PHP echo $text_part; ?> </p> </div>

В резуль­та­те на стра­ни­це полу­чит­ся строч­ка: «При­вет! А вы зна­е­те, что этот код напи­сан на PHP?»

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

Информация о процессоре

Для этого необходимо использовать метод getrusage(). Но учтите, что на Windows эта функция работать не будет.

print_r(getrusage());
/* prints
Array
(
     => 0
     => 0
     => 2
     => 3
     => 12692
     => 764
     => 3864
     => 94
     => 0
     => 1
     => 67
     => 4
     => 0
     => 0
     => 0
     => 6269
     => 0
)
*/

Картина, изложенная выше, будет понятно тем, у кого есть опыт в системном администрировании. Для всех остальных предлагаем расшифровку:

  • ru_oublock: количество операций блочной записи
  • ru_inblock: количество операций блочного чтения
  • ru_msgsnd: количество отправленных сообщений
  • ru_msgrcv: количество принятых сообщений
  • ru_maxrss: максимальный размер невыгружаемого набора
  • ru_ixrss: общий объем разделяемой памяти
  • ru_idrss: общий объем неразделяемых данных
  • ru_minflt: количество используемых страниц памяти
  • ru_majflt: количество ошибок отсутствия страниц
  • ru_nsignals: количество принятых сигналов
  • ru_nvcsw: количество переключений контекста процессом
  • ru_nivcsw: количество принудительных переключений контекста
  • ru_nswap: количество обращений к диску при подкачке страниц
  • ru_utime.tv_usec: время работы в пользовательском режиме (микросекунды)
  • ru_utime.tv_sec: время работы в пользовательском режиме (секунды)
  • ru_stime.tv_usec: время работы в привилегированном режиме (микросекунды)
  • ru_stime.tv_sec: время работы в привилегированном режиме (секунды)

Для того чтобы узнать какие ресурсы вашего процессора используются скриптом, вам необходимо значение ‘user time’ (время работы в пользовательском режиме) и ’system time’ (время работы в привилегированном режиме). Вы можете получить результат как в секундах, так и в микросекундах. Для того чтобы превратить общее количество секунд в десятичное число, вам необходимо разделить значение микросекунд на 1 миллион и добавить к значению секунд.

Запутанно как-то. Вот пример:

// отдыхаем 3 секунды
sleep(3);

$data = getrusage();
echo "User time: ".
	($data +
	$data / 1000000);
echo "System time: ".
	($data +
	$data / 1000000);

/* выводит
User time: 0.011552
System time: 0
*/

Хотя выполнение скрипта заняло около 3-х секунд, процессор не был сильно нагружен. Дело в том, что при вызове (sleep) скрипт практически не потребляет ресурсов процессора. Вообще существует множество задач, которые занимают значительное время, но при этом не используют процессор. К примеру, ожидание операций связанных с диском. Так что вы не всегда используете процессорное время в своих скриптах.

Вот ещё пример:

// пройтись  10 миллионов раз
for($i=0;$i<10000000;$i++) {

}

$data = getrusage();
echo "User time: ".
	($data +
	$data / 1000000);
echo "System time: ".
	($data +
	$data / 1000000);

/* выводит
User time: 1.424592
System time: 0.004204
*/

Работа скрипта заняла 1.4 секунды процессорного времени. В данном случае, время системных вызовов вообще низкое.

Время работы в привилегированном режиме (System Time) – это время, которое процессор затрачивает на выполнение системных запросов к ядру от имени программы. Пример:

$start = microtime(true);
// вызываем microtime каждые 3 секунды
while(microtime(true) - $start < 3) {

}

$data = getrusage();
echo "User time: ".
	($data +
	$data / 1000000);
echo "System time: ".
	($data +
	$data / 1000000);

/* выводит
User time: 1.088171
System time: 1.675315
*/

Теперь системного времени затратилось намного больше, чем в прошлом примере. Всё благодаря методу microtime(), который использует ресурсы системы.

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

Создание функций с переменным числом аргументов

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

Но для начала, вспомним как мы создаём функции обычным образом:

// функция с двумя необязательными параметрами
function foo($arg1 = '', $arg2 = '') {
	echo "arg1: $arg1\n";
	echo "arg2: $arg2\n";

}

foo('hello','world');
/* выведет:
arg1: hello
arg2: world
*/

foo();
/* выведет:
arg1:
arg2:
*/

Теперь посмотрим на то, как можно написать функцию с неограниченным количеством аргументов. Для этого будет использовать метод func_get_args():

// не указываем аргументы
function foo() {

	// возвращает массив, переданных аргументов
	$args = func_get_args();

	foreach ($args as $k => $v) {
		echo "arg".($k+1).": $v\n";
	}

}

foo();
/* ничего не выведет */

foo('hello');
/* выведет
arg1: hello
*/

foo('hello', 'world', 'again');
/* выведет
arg1: hello
arg2: world
arg3: again
*/

Полиграфический салон работает по обычному графику

Полиграфическое оборудование

Группа Компаний «Р-Принт» предлагает Вашему вниманию широкий ассортимент полиграфического оборудования, офисного оборудования, а также комплекты оборудования для мини-типографий и копировальных центров на базе ризографов. Мы работаем на российском полиграфическом рынке с 1990 года. Центральный офис фирмы находится в Санкт-Петербурге, филиал — в Москве. В Архангельске, Баку, Великом Новгороде, Калининграде, Мурманске, Нижнем Новгороде, Петрозаводске, Перми, Пскове, Сыктывкаре, Череповце работают наши региональные дилеры. Группа Компаний «Р-Принт» первый российский дилер японской фирмы «RISO» — ведущего мирового производителя ризографов (цифровых дупликаторов). Помимо ризографов у нас в продаже имеется и другое полиграфическое оборудование:

  • Листоподборочные машины: Duplo
  • Листоподборщики ручные: Малютка
  • Брошюровальные машины: Duplo, Nagel
  • Фальцевальные машины (фальцовщики): Cyklos, Duplo
  • Биговальные машины (биговщики): Fastbind, Cyklos
  • Проволокошвейные машины: Introma
  • Резаки для бумаги: Ideal, Dahle
  • Ламинаторы: GMP, Royal Sovereign, Fellowes, Rexel; плёнка для ламинирования
  • Переплётное оборудование (брошюровщики): Royal Sovereign, Renz, Fellowes, JBI, Metalbind, Rexel; термоклеевые машины: Fastbind, PB; пластиковые и металлические пружины; обложки для переплёта.
  • Бумагосверлильные машины: Nagel
  • Обрезчики угов, вырубщики: Cyklos
  • Степлеры: Rapid, Kw-Trio
  • Шредеры (уничтожители документов): HSM, Ideal, Fellowes

На все оборудование для полиграфии и офиса предоставляется гарантийное и послегарантийное сервисное обслуживание. В сервисных службах Санкт-Петербурга, Москвы и у наших дилеров работают сертифицированные инженеры.

Полиграфические услуги

Сеть копировальных центров Группы Компаний «Р-Принт» в Санкт-Петербурге оказывает весь спектр полиграфических услуг:

  • Издательская деятельность (присвоение ISBN): печать брошюр, книг,буклетов в любыхпереплётах и любыми тиражами, подготовка книг к печати ( набор, вёрстка, корректировка, оформление)
  • полноцветная цифровая печать (А3+)
  • высококачественная офсетная печать (А3+)
  • многоцветная печать на ризографе (А3, А4)
  • печать различных форматов на черно-белых и полноцветных копировальных аппаратах
  • все виды послепечатной обработки тиражей (резка, брошюровка, листоподборка, фальцовка, биговка, перфорация, нумерация,сверловка, вырубка, склейка блоков…)
  • все виды переплётных работ (скрепка, клеевой переплет, переплет на пластиковую и металлическую пружину, термоклеевой переплет, твердый переплет, в том числе обжимной — в присутствии заказчика…)
  • изготовление визиток, брошюр, буклетов, плакатов, бланков, другой полноцветной и одноцветной полиграфической продукции
  • Печать на футболках — нанесение красочного изображения на футболки.
  • Широкоформатная печать на плоттере, в том числе на холсте
  • Плоттерная резка
  • Печать плакатов на термопринтере
  • Подарочная полиграфия
  • Шелкография
  • Печать и копирование чертежей А0
  • Услуги дизайнера
  • Изготовление изделий на магнитной основе

В офисах нашей фирмы для Вас постоянно открыты демонстрационные залы с оборудованием. Наши менеджеры с удовольствием ответят на все интересующие Вас вопросы.

Описание

sprintf

Возвращает строку, созданную с использованием строки формата

format.

Строка формата состоит из директив:


обычных символов (за исключением %), которые

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

параметров. Это относится также к fprintf(),

sprintf() и printf().

Каждый описатель прреобразований состоит из знака процента

(%), за которым следует один или более

дополнительных элементов (в том порядке, в котором они здесь

перечислены):

  1. Необязательный описатель заполнения, который

    определяет, какой символ будет использоваться для дополнения

    результата до необходимой длины. Это может быть пробел или

    . По умолчанию используется пробел.

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

    См. примеры ниже.

  2. Необязательный описатель выравнивания,

    определяющий выранивание влево или вправо. По умолчанию

    выравнивается вправо, используется для

    выравнивания влево.

  3. Необязательное число, описатель ширины,

    определяющий минимальное число символов, которое будет содержать

    результат этого преобразования.

  4. Необязательный описатель точности,

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

    плавающей точкой. Имеет смысл только для числовых данных типа

    float. (Для форматирования чисел удобно также

    использовать функцию number_format().)

  5. Описатель типа, определяющий, как трактовать

    тип данных аргумента. Допустимые типы:

    % — символ процента. Аргумент не

    используется.

    b — аргумент трактуется как целое и выводится


    в виде двоичного числа.

    c — аргумент трактуется как целое и выводится

    в виде символа с соответствующим кодом ASCII.

    d — аргумент трактуется как целое и выводится

    в виде десятичного числа со знаком.

    e — аргумент трактуется как float и выводится

    в научной нотации (например 1.2e+2).

    u — аргумент трактуется как целое и выводится

    в виде десятичного числа без знака.

    f — аргумент трактуется как float и выводится

    в виде десятичного числа с плавающей точкой.

    o — аргумент трактуется как целое и выводится

    в виде восьмеричного числа.

    s — аргумент трактуется как строка.

    x — аргумент трактуется как целое и выводится

    в виде шестнадцатиричного числа (в нижнем регистре букв).

    X — аргумент трактуется как целое и выводится

    в виде шестнадцатиричного числа (в верхнем регистре букв).

Начиная с PHP 4.0.6 в строке формата поддерживается нумерация и изменение

порядка параметров. Например:

Пример 1. Изменение порядка параметров

Пример 2. Изменение порядка параметров

Пример 3. Изменение порядка параметров

Пример 4. Изменение порядка параметров

Сериализация

Вам когда-нибудь приходилось хранить комплексные данные в базе или в файле? Для того чтобы сконвертировать объект в строку в PHP предусмотрена специальная функция.

Вообще говоря, этих методов 2: serialize() и unserialize()

// сложный массив
$myvar = array(
	'hello',
	42,
	array(1,'two'),
	'apple'
);

// конвертируем в строку
$string = serialize($myvar);

echo $string;
/* выведет
a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";}
*/

// получаем исходное значение
$newvar = unserialize($string);

print_r($newvar);
/* выведет
Array
(
     => hello
     => 42
     => Array
        (
             => 1
             => two
        )

     => apple
)
*/

Вот так вот работают эти функции. Однако из-за бурного роста популярности JSON, в PHP 5.2 были добавлены 2 метода json_encode() и json_decode(). Их работа схожа с serialize():

// сложные массив
$myvar = array(
	'hello',
	42,
	array(1,'two'),
	'apple'
);

// конвертируем в строку
$string = json_encode($myvar);

echo $string;
/* выведет
,"apple"]
*/

// восстанавливаем исходное значение
$newvar = json_decode($string);

print_r($newvar);
/* prints
Array
(
     => hello
     => 42
     => Array
        (
             => 1
             => two
        )

     => apple
)
*/

Этот вариант более компактный и совместимый с другими языками, такими как JavaScript. Однако при работе с очень навороченными объектами может возникнуть потеря данных.

Связи (отношения) в RedBeanPHP

(связь один ко многим). Достанем из БД все книги, у которых

$category_id = 1;
$category = R::load('category', $category_id);
$books = $category->ownBookList;

// Сортировка и лимит
$books = $category->with('ORDER BY `title` ASC LIMIT 3')->ownBookList;

// Но более предпочтительным способом является метод withCondition()
$status = 1;
$limit = 3;
$books = $category
  ->withCondition('status = ? ORDER BY title ASC LIMIT ?', )
  ->ownBookList;

foreach ($books as $book){
  echo $book->title.'<br>';
}

(связь Многие к одному). Достанет из базы название категории, с которой связана книга

$book = R::load('book', 1);
$category = $book->category->title;

(связь Многие ко многим). Достанет из базы (из связующей таблицы) все книги этой категории:

$category = R::load('category', 1);
$books = $category->sharedBookList;

print_r($books);

Подключение

В корне проекта создать файл , в нём подключить автозагрузчик композера и подключиться к БД Mysql:

// Подключаем автозагрузчик composer
require_once __DIR__.'/vendor/autoload.php';

// Создаём псевдоним для указанного класса
class_alias('\RedBeanPHP\R', '\R');

/**
 * Подключаемся к базе данных
 * Последний (4-й) параметр по умолчанию выставлен в FALSE
 * Если нужно применить заморозку таблиц в БД (отменить создание на лету),
 * то нужно данный параметр выставить в TRUE
 * или так: R::freeze(true);
 */
R::setup( 'mysql:host=localhost;dbname=redbeanphp','root', '', false);

// Проверка подключения к БД
if(!R::testConnection()) die('No DB connection!');

/**
 * Если нужно работать с таблицами, в названии которых
 * присутствует знак подчёркивания (_), то необходимо воспользоваться 
 * таким методом
 */
R::ext('xdispense', function( $type ){
  return R::getRedBean()->dispense( $type );
});
// Использовать так:
$test = R::xdispense('test_table');
// Code...
R::store($test);

С этим читают