Php занятие 2. массивы

Точное сравнение: 0 == ‘строка’

PHP язык без строгой типизации и потому иногда могут возникать неожиданные результаты при сравнении (проверке) разных значений…

if( 0 == 'строка' ) echo 'Неужели?'; // увидим: 'Неужели?'

// строка превращается в число при сравнении и становится 0:
var_dump( 0 == 'строка' );   //> bool(true)

// но
var_dump( '0' == 'строка' ); //> bool(false)

Происходит так очевидно, потому что превращается в ноль: , а это true, разумеется…

Так например можно пропустить переменную запроса:

// $_GET может быть любой строкой и проверка всегда будет срабатывать...
if( $_GET == 0 ){
	echo $_GET;
}

// поэтому по возможности ставьте проверку строго по типу
if( $_GET === '0' ){
	echo $_GET;
}

Все следующие значения одинаковы, при сравнении через (не строгий оператор сравнения):

0 == false == "" == "0" == null == array()

Ну и так:

1 == '1нечто' == true
true == array(111)

Создаем простой скрипт

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

Для начала нам нужно установить компилятор PHP на компьютер. Так как мы выяснили, что PHP — это серверный язык, то существуют специальные готовые сборки веб-серверов, которые включают в себя, помимо PHP, и другие полезные инструменты, например, СУБД MySQL. Одной из таких сборок является Open Server. Для написания кода будем использовать текстовый редактор Sublime Text 3.

Перейдем в папку domains веб-сервера Open Server и создадим в ней новую папку example. Внутри папки example создадим2 файла: index.html и handler.php.

Код нашей главной страницы index.html будет иметь следующий вид:

Мы имеем форму с текстовым полем и кнопкой. Атрибут action тега <form> указывает на имя и путь файла-скрипта, который будет обрабатывать введенные данные, — в нашем случае это файл handler.php. Атрибут method указывает на способ передачи данных — get; также существует метод передачи post.

Напишем код для скрипта handler.php.

Немного разберем код:

  • В строках 3–5 создается три массива, которые содержат информацию о фруктах, овощах и ягодах. На самом деле подобного рода данные должны храниться в базе данных и затем из нее вытягиваться. Но в качестве примера мы ввели их вручную в коде.
  • В строке 7 создается переменная $searchText, которая содержит в себе введенное в текстовое поле значение. Это значение берется из суперглобального массива $_GET, в квадратных скобках которого указывается имя текстового поля, которое мы задали в файле index.html. Этот массив инициализируется при отправке формы.
  • В строках 9–15 сначала проверяется, была ли нажата кнопка отправки формы, которая имеет имя searchSubmit, затем происходит проверка введенного значения и, в зависимости от того, какой вид продукта ввел пользователь, в переменную $products записывается ранее созданный соответствующий массив.
  • В строках 17–28 происходит вывод массива на экран в виде таблицы. Как видите, PHP отличает HTML-теги от обычных строк и выводит в окно браузера с помощью функции echo HTML-таблицу.
  • В строке 22 происходит перебор нашего массива products с помощью специального оператора цикла foreach.

Чтобы придать таблице красивый вид, мы создадим небольшой файл стилей styles.css. Он подключается в файле handler.php во второй строчке кода.

Все готово. Запустим наш веб-сервер и в адресной строке браузера перейдем по адресу example.

Введем в поле значение «фрукты» и нажмем кнопку Поиск.

Откроется главная страница index.html.

В результате веб-сервер перебросил нас на выполнение скрипта handler.php, который, в свою очередь, отобразил на экране таблицу фруктов

Обратите внимание на адресную строку.

Так выглядит наш get-запрос.

После вопросительного знака указывается имя параметра, в данном случае это название поля searchText, и через знак «=» указывается его введенное значение. Таких пар «имя = значение» может быть несколько, они должны разделяться между собой знаком «&». Не рекомендуется использовать данный метод передачи, если вам нужно передать большой объем данных либо же какие-то конфиденциальные данные, например, логин и пароль. В таких случаях используется метод post.

При дальнейшем изучении — например, в рамках курса PHP-разработчик от Skillbox — вы обязательно узнаете о таких важных вещах, как взаимодействие PHP с базой данных, построение объектной модели, выполнение асинхронных запросов без перезагрузки страницы, и о том, как строится архитектура высоконагруженных систем.

Заключение

Подчеркнем еще раз, что PHP — один из самых востребованных языков программирования на данный момент. И вдруг вы до сих пор не решились, стоит ли начинать учить PHP или нет, то можете быть уверены: — он откроет для вас большие возможности. Сможете ли вы ими воспользоваться — зависит только от вас.

Объединение массивов

Вызов функции array_merge() — самый просто способ объединить несколько массивов. Все данные будут слиты воедино, повторяющиеся данные перезапишутся:

$array1 = ;
$array2 = ;

$merge = array_merge($array1, $array2);
print_r($merge);
// Array
// (
//      => A
//      => B
//      => c
//      => D
// )

Для того чтобы удалить значения одного массива из другого массива воспользуйтесь функцией array_diff(). Обратная операция реализуется при помощи вызова array_intersect(). Примеры:

$array1 = ;
$array2 =   	;

$diff = array_diff($array1, $array2);
print_r($diff); // 

$intersect = array_intersect($array1, $array2);
print_r($intersect);  // 

Находим наибольшее и наименьшее значение многомерного массива на PHP

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

И, соответственно, с некими ключами:

В таком случае нахождение максимальных и минимальных значений немного затруднительно, но так же реально.

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

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

В качестве небольшого бонуса приведу пример еще одного популярного двумерного массива:

Под популярностью я подразумеваю не содержание, а пример его структуры. Допустим, что здесь вам необходимо сделать вывод максимального и минимального значения только ключей «price».

Первое, что вам нужно в таком случае – получить новый массив только с этими данными:

И дальше по примеру того же одномерного массива выводим максимум и минимум:

Как получить часть строки (подстроку)

Чтобы получить подстроку можно использовать: substr(), iconv_substr() или mb_substr().

Все эти функции одинаковые, если нужно обрабатывать латиницу. А отличия начинаются когда нужно обработать например кириллицу или другой язык, тут подходят только: mb_substr() и iconv_substr(), потому что в них можно указать кодировку и они работают с символами в указанной кодировке.

Однако нужно знать, что скорость их работы в разы ниже: substr() работает с одинаковой скоростью для строки любой длинны. А вот mb_substr() и iconv_substr() работают тем медленнее чем длине строка в них указывается… В среднем они в 5-10 раз медленнее, однако альтернатив нет, если нужно обработать кириллицу, придется использовать их…

// синтаксис:
// mb_substr ( $string, $start, $length, $encoding )

$str = "Поиск текстов";

// 3 символа начиная с третьего (отсчет идет от нуля)
$sub_1 = mb_substr( $str, 2, 3 ); // обычно кодировку указывать не обязательно...

// Берем подстроку, начиная с первого символа и до третьего с конца
$sub_2 = mb_substr( $str, 6, -2, 'utf-8' );

// результат
echo $sub_1 .' - '. $sub_2; //> бой - текст

Всевозможные варианты:

// Латиница
$str = 'abcdef';

echo substr( $str, 1);     // bcdef
echo substr( $str, 1, 3);  // bcd
echo substr( $str, 0, 4);  // abcd
echo substr( $str, 0, 8);  // abcdef
echo substr( $str, -1, 1); // f

// Кириллица
$str = 'абвгдеж';

echo mb_substr( $str, 1);     // бвгдеж
echo mb_substr( $str, 1, 3);  // бвг
echo mb_substr( $str, 0, 4);  // абвг
echo mb_substr( $str, 0, 8);  // абвгдеж
echo mb_substr( $str, -1, 1); // ж

// с указанием кодировки, обычно это не обязательно
echo mb_substr( $str, 1, null, 'utf-8'); // бвгдеж
echo mb_substr( $str, 1, 3, 'utf-8');    // бвг
echo mb_substr( $str, 0, 4, 'utf-8');    // абвг
echo mb_substr( $str, 0, 8, 'utf-8');    // абвгдеж
echo mb_substr( $str, -1, 1, 'utf-8');   // ж

// iconv_substr(), обычно для нее нужно указать кодировку
// iconv_* медленнее чем mb_*
echo iconv_substr( $str, 1, 9999999, 'utf-8'); // бвгдеж
echo iconv_substr( $str, 1, 3, 'utf-8');       // бвг
echo iconv_substr( $str, 0, 4, 'utf-8');       // абвг
echo iconv_substr( $str, 0, 8, 'utf-8');       // абвгдеж
echo iconv_substr( $str, -1, 1, 'utf-8');      // ж

Как вывести массив в PHP

Каждый из элементов в приведенном выше списке называется значением. Каждое значение также имеет ключ. Если вы сами не задаете для элемента ключ, он присвоится автоматически, и это будет порядковый номер. Ниже приводится пример работы с массивами PHP:

$transportation = array(
    0 => ‘Planes’,
    1 => ‘Trains’,
    2 => ‘Automobiles’
);

=> — это оператор присваивания, а числа являются ключами

Обратите внимание, что мы начали с. Если вы устанавливаете ключи сами, то можно начать с 1

Но я не рекомендую делать этого, так как автоматическая нумерация начинается с .

Выводим первый элемент массива:

<?php echo $transportation; ?>

Видите ключ в квадратных скобках? Этот код выведет значение «Planes«.

Перебор массива

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

($i=0; $i<count($mass); $i++)

echo $mass;

1
2
3

($i=;$i<count($mass);$i++)

echo$mass$i;

С ассоциативным массивом все немного сложнее. Рассмотрим пример:

$base = array(

«Petrov Ivan» => «1989-03-20»,
«Sidorov Semen» =>»1990-09-09″,

);

for (reset($base); ($k=key($base)); next($base)) echo «$k родился {$base}<br>»;

1
2
3
4
5
6
7
8

$base=array(

«Petrov Ivan»=>»1989-03-20»,

«Sidorov Semen»=>»1990-09-09»,

);

for(reset($base);($k=key($base));next($base))echo»$k родился {$base}<br>»;

В массивах есть такое понятие как текущий элемент. Функция reset() просто устанавливает этот элемент на первую позицию в массиве. Функция key() возвращает ключ, который имеет текущий элемент. Функция next() перемещает текущий элемент на одну позицию вперед.

Помимо своей основной задачи, функции reset() и next(), возвращают некоторые значения:

  • reset() — возвращает значение первого элемента массива (false если массив пуст);
  • next() — возвращает значение элемента, следующего за текущим (fals если такого элемента нет).

Такой вид перебора массива, когда сначала вычисляется очередной ключ, а уж затем по нему косвенно находится значение элемента массива, называется косвенным. У такого вида перебора имеются свои недостатки:

  1. Вложенные циклы. Нельзя перебирать массив в двух вложенных циклах, так как второй вложенный цикл for «испортит» положение текущего элемента у первого цикла.
  2. Нулевой ключ.Если в массиве встретится нулевой ключ, то наш цикл вообще не отработает ни одного раза.

Гораздо удобнее использовать метод прямого перебора. Суть метода заключается в том, чтобы сразу на каждом «витке» цикла одновременно получать и ключ, и значение текущего элемента. Не будем описывать устаревший способ перебора с помощью функции each() и перейдем к foreach.

Перебор циклом foreach

Данный цикл разработан специально для перебора массивов. Вот как с помощью ее можно перебрать и распечатать массив:

foreach ($base) as $k =>$v) echo ‘$k родился $v’;

1 foreach($base)as$k=>$v)echo’$k родился $v’;

Подробнее ознакомиться с механизмом работы данного цикла можно в статье о циклах.

Используем другие операторы при работе с массивами

PHP действует по-разному при применении других операторов к массивам. Сейчас посмотрим какие могут быть результаты.

Fatal Error: Unexpected Operand Type

PHP выкинет fatal error при использовании следующий операторов по отношению к массивам:

  • побитовый оператор не (~)
  • арифметический оператор смены знака (-)
  • арифметический оператор вычитания (-)
  • арифметический оператор умножения (*)
  • арифметический оператор деления (/)

Работа с типом Массив, как с типом Integer

При использовании следующих операторов, работа с массивами будет преобразована к работе с целыми числами. Пустой массив (без элементов) это int(0), а не пустой int(1).

  1. Логическое отрицание (!) вернёт true если массив пуст и false если в массиве один или более элемент.
  2. Побитовый и (&) вернёт 1 если оба операнда не пусты и 0 если оба операнда пусты.
  3. Побитовый или (|) вернёт 0 если оба операнда пусты; в противном случае 1.
  4. Побитовый xor (^) вернёт 0 если оба массива одновременно или пусты или полны. Если хотя бы один из массив пуст, вернётся 1.
  5. Сдвиг массива на несколько шагов с помощью оператора (<<) вернёт 1 << n если массив не пуст. В противном случае 0.
  6. Сдвиг права (>>) производит только такое же действие, только в другую сторону.
  7. Остаток от деления (%) вернёт true если оба массива не пусты. Если второй массив пуст, то это вызовет ошибку деление на ноль (“Division by Zero”). Если первый массив пуст, то будет возвращён 0 (результат 0 % 1).
  8. Логическое и (&& и AND) вернёт false если любой из массивов пуст. Если они оба не пусты, то true.
  9. Логическое или (|| и OR) вернёт true если оба операнда не пусты. В противном случае false.
  10. Если оба массива пусты или не пусты, логический (XOR) вернёт false. В противном случае, если хотя бы один массив пуст true.

Работа с типом Массив, как с типом Строка

При конкатенации двух массивов с помощью (.) будет получен следующий результат:

<?php
$array1 = array(0, 1, 2, 3);
$array1 = array(0, 1, 2, 3);
var_dump($array1 . $array2);
string(10) "ArrayArray"

Без эффекта

Использование операторов (++ и —) не даёт никакого эффекта.

<?php
$array1 = $array2;
var_dump((++$array1) === $array2);
bool(true)

Задачи для решения

Работа с массивами

Создайте массив $arr=. Выведите значение массива на экран с помощью функции var_dump().

С помощью массива $arr из предыдущего номера выведите на экран содержимое первого, второго и третьего элементов.

Создайте массив $arr=
и с его помощью выведите на экран строку ‘a+b, c+d’.

Создайте массив $arr с элементами 2, 5, 3, 9.
Умножьте первый элемент массива на второй, а третий элемент на четвертый.
Результаты сложите, присвойте переменной $result. Выведите на экран значение этой переменной.

Заполните массив $arr числами от 1 до 5.
Не объявляйте массив, а просто заполните его
присваиванием $arr[] = новое значение.

Ассоциативные массивы

Создайте массив $arr.
Выведите на экран элемент с ключом ‘c’.

Создайте массив $arr.
Найдите сумму элементов этого массива.

Создайте массив заработных плат $arr. Выведите на экран зарплату Пети и Коли.

Создайте ассоциативный массив дней недели.
Ключами в нем должны служить номера дней от начала недели (понедельник — должен иметь ключ 1, вторник — 2 и т.д.).
Выведите на экран текущий день недели.

Пусть теперь номер дня недели хранится в переменной$day, например там лежит число 3.
Выведите день недели, соответствующий значению
переменной $day.

Многомерные массивы

Создайте многомерный массив $arr.
С его помощью выведите на экран слова ‘joomla’, ‘drupal’, ‘зеленый’, ‘красный’.

Создайте двухмерный массив. Первые два ключа — это ‘ru’ и ‘en’.
Пусть первый ключ содержит элемент, являющийся массивом названий дней недели по-русски,
а второй — по-английски. Выведите с помощью этого
массива понедельник по-русски и среду
по английски (пусть понедельник — это первый день).

Пусть теперь в переменной $lang хранится
язык (она принимает одно из значений или ‘ru’, или ‘en’ — либо то, либо то),
а в переменной $day
номер дня. Выведите словом день недели,
соответствующий переменным $lang и $day.
То есть: если, к примеру, $lang = ‘ru’ и $day = 3 —
то выведем ‘среда’.

Обычный массив в PHP:

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

В PHP есть два вида массива, первый это ассоциативный массив и массив список.

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

Объявление массива:

Что бы объявить (Создать), обычный массив в PHP нужно использовать внутри скобок пишем сам массив.

PHP

1
2
// Объявление ассоциативного массива

$arr=array(‘name’=>’Vova’,’surname’=>’Pupkin’);

Как видите всё просто, и это ключи, после идёт значение, то есть для ключа это значение , а для это значение .

Что бы сделать массив список, просто не надо давать имя ключу.

PHP

1
2
// Объявление список массива

$arr=array(‘Vova’,’Pupkin’);

Также объявлять массив можно просто написав значения в квадратных скобках, вместо , но принято так.

Добавление в массив:

Добавить новое значение в конец массива очень просто.

PHP

1
2
3
4
5
6
7
8
9
10
11
// Объявление ассоциативного массива

$arr_associative=array(‘name’=>’Vova’,’surname’=>’pupkin’);

// Объявление списка массива

$arr_list=array(92,12,39)

// Добавление значения в ассоциативном массиве

$arr_associative’age’=22;

// Добавление значения в список массив

$arr_list=12;

Как видите надо только перед названием массива, поставить квадратные скобки и приравнять к какому-то значению, если речь идёт о ассоциативном массиве, то ещё надо название ключа добавить.

Также таким образом можно менять значения в массиве, надо только в квадратные скобки ввести название ключа или индекс.

Вывод массива на экран:

Вывод через echo массив PHP работает очень просто, но с одним не достатком.

PHP

1
2
3
4
// Объявление ассоциативного массива

$arr=array(‘name’=>’Vova’,’surname’=>’pupkin’);

echo$arr’name’;// Вывод имени

Вот что получается.

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

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

PHP

1
2
3
4
// Объявление ассоциативного массива

$arr=array(‘name’=>’Vova’,’surname’=>’pupkin’);

print_r($arr);// Вывод всего массива

Вот результат.

Но как видите такой вариант скорее подойдёт для отладки (Проверка ошибок).

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

PHP

1
2
3
4
5
6
7
// Объявление ассоциативного массива

$arr=array(10,29,12,33,90,1);

// Используется foreach для вывода массива

foreach($arras$index=>$value){

echo$value.’ ‘;

}

Вот результат.

Как видите не чего лишнего, ещё такой способ подойдёт для изменение массива, к примеру, возведение в квадрат всех значений массива.

PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Объявление ассоциативного массива

$arr=array(10,29,12,33,90,1);

// Вывод массива до изменений

print_r($arr);

// Изменения массива через foreach

foreach($arras$index=>$value){

$arr$index=$value*$value;// возводим в квадрат

}

echo'<br>’;// перенос на другую строчку

// Вывод массива после изменений

print_r($arr);

Вот результат.

Как видите массив изменился, подробнее про foreach узнаете из части учебника про циклы (Ссылка на часть).

Использование массивов

Используем функцию count():

1 2 3 4 <?php $products = array(«шоколад»,»сок»,»пирожное»); echo count($products);//выведет 3 ?>

Перебор элементов. Перебрать все элементы автомассива можно с помощью конструкции for или foreach:

1 2 3 4 5 6 7 <?php $products = array(«шоколад»,»сок»,»пирожное»); for($i = 0; $i < count($products);$i++): echo $products; echo «<br>»; endfor; ?>
1 2 3 4 5 6 7 <?php $products = array(«шоколад»,»сок»,»пирожное»); foreach($products as $product): echo $product; echo «<br>»; endforeach; ?>

Чтобы добавить новый элемент в массив (осуществить запись в массив), нам достаточно выполнить следующую строку:

1 2 3 <?php $products[] = “новый продукт”; ?>

Элементу будет автоматически присвоен новый числовой индекс.

2. Ассоциативные массивы. Особенность ассоциативных массивов – это строковые имена ключей элементов вместо числовых индексов.

Мы можем создать ассоциативный массив двумя способами:

1 $cars_age=array(«Mazda»=>»3″,»Toyota»=>»1″,»Honda»=>»5»);

или

1 2 3 $cars_age = 3; $cars_age = 1; $cars_age = 5;

Теперь любой элемент доступен через присвоенный ему ключ:

1 echo $cars_age;//выведет 5

Перебор всех элементов ассоциативного массива осуществляется следующим образом:

1 2 3 4 5 6 7 8 <?php $cars_age=array(«Mazda»=>»3″,»Toyota»=>»1″,»Honda»=>»5»);   foreach($cars_age as $car => $age){   echo «Автомобиль » . $car . » имеет возраст: » . $age;   echo «<br>»; } ?>

3. Многомерные массивы содержат в качестве элементов другие массивы:

1 2 3 4 5 6 7 8 <?php // создаем двумерный массив: $cars = array(   array(«Mazda»,100,96),   array(«Toyota»,60,59),   array(«Honda»,110,100) ); ?>

Получить значения какого-либо элемента данного массива можно следующим образом:

1 2 3 4 5 <?php echo $cars;//выведет Mazda echo $cars;//выведет 100 … ?>

Мы можем создать и трехмерный массив:

1 2 3 4 5 6 7 8 9 10 11 12 $products = array( «drinks»=>array( «milk», «water», «cola» ), «fruits»=>array( «apple», «orange», «cherry» ) );

В результате мы получим следующую структуру массива:Array ( => Array ( => milk => water => cola )

=> Array ( => apple => orange => cherry )

Теперь получаем значение нужного элемента:

1 2 3 <?php echo $products ; // возвращает «milk» ?>

вывод массива в PHP. Вывести любой массив можно с помощью функции print_r(), например:

1 2 3 <?php print_r($products); ?>

Удалить элемент в массиве можно следующим образом:

1 2 3 4 <?php unset($products);//для простого индексируемого массива unset($products); ?>

При этом при удалении элемента индексы других элементов остаются неизменными.

Функции для работы с массивами:

Сортировка массивовarray_search – поиск значения в массиве

Другие посты

Бонусные функции

Вот несколько примеров того, что можно делать с массивами:

<?php $items_num = count( $array ); ?>

Этот код рассчитывает, сколько элементов содержится в массиве. Например, можно вывести «Найдено 14 элементов, удовлетворяющих условиям поиска» (документация):

<?php $array = sort( $array ); ?>

Функция массива PHP sort() сортирует данные по возрастанию, и назначает для переменных значения в соответствии с новым порядком. Можно отсортировать массив по числам или по строкам (документация):

<?php if( is_array( $array ) ) {

Функция is_array() проверяет, является ли переменная массивом (документация). Это может быть полезно, чтобы преобразовать переменную еще в начале кода, например:

$array = ‘’;

А затем преобразовать в массив. Так можно определить, извлекли ли вы контент или еще нет.

Создание массива

Массивы создаются с помощью функции . Функция принимает ноль или более аргументов и возвращает новый массив, который присваивается переменной с помощью оператора присваивания . Если указаны аргументы, они используются для инициализации массива данными.

Массивы PHP могут увеличиваться и уменьшаться динамически по мере добавления и удаления элементов, поэтому нет необходимости указывать длину массива во время создания, как в некоторых других языках программирования.

Мы можем создать пустой массив следующим образом:

$colorArray = array();

В качестве альтернативы мы можем создать массив, предварительно инициализированный значениями, предоставив значения в качестве аргументов функции :

$colorArray = array("Красный", "Желтый", "Зеленый", "Синий", "Индиго");

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

$colorArray = ;

Теперь у нас есть два способа ы массив что-то добавить. Если мы знаем, на какое место в массиве вставить элемент, используем индекс:

$colorArray = "Желтый"
$colorArray = "Зеленый"

Если не известны конкретные индексы или мы просто хотим добавить элементы в массив по порядку, подойдёт такая запись:

$colorArray[] = "Желтый"
$colorArray[] = "Зеленый"

В PHP существует три основных типа массивов:

  • Индексированные или числовые массивы: массив с числовым индексом, в котором значения хранятся линейно.
  • Ассоциативные массивы: массив со строковым индексом, в котором вместо линейного хранилища каждому значению может быть назначен определенный ключ.
  • Многомерные массивы: массив, содержащий один или несколько массивов, доступ к которому можно получить через несколько индексов.

5 последних уроков рубрики «PHP»

Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак

В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение

В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

Время выполнения PHP скрипта

Build In Post

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

Простой вариант

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

Логика проста: сначала замеряем текущее время в микросекундах, выполняем код, опять замеряем текущее время и высчитываем разницу времени — эта разница и будет временем выполнения кода. С помощью функции форматируем результат в более читаемый формат.

$start = microtime( true );

get_bloginfo( 'homeurl' ); // какой-то код

$diff = microtime( true ) - $start;
$diff = sprintf( '%.6F sec.', $diff );

echo "Время выполнения: $diff"; // Время выполнения: 0.000014 sec.

Вариант посложнее

Для измерения скорости работы PHP кода, когда-то написал такую функцию:

/**
 * Считает время выполнения PHP кода (в секундах).
 *
 *     exec_time();
 *     // код
 *     echo exec_time('get') .' сек.'; //> 0.03654 сек.
 *
 * @version 3.4.5
 *
 * @param string $phase       run             - включает подсчет: первый раз или после паузы (по умолчанию).
 *                            start           - очищает все кэши и включает подсчет - clear & run.
 *                            get             - получает разницу, между предыдущим вызовом функции.
 *                            getall|end|stop - получает разницу, между первым вызовом функции (run).
 *                            pause           - временная остановка подсчета. exec_time() для продолжения.
 *                            clear           - полностью очищает результат. exec_time() для начала нового подсчета.
 * @param int    $round       До скольки знаков после запятой округлять результат.
 *
 * @return float|void Example 0.03654
 */
function exec_time( $phase = 'run', $round = 6 ){
	static $prev_time, $collect;

	if( 'start' === $phase ){
		$collect = $prev_time = 0;
	}
	elseif( 'clear' === $phase ){
		return $collect = $prev_time = 0;
	}

	list( $usec, $sec ) = explode( ' ', microtime() );
	$mctime = bcadd( $usec, $sec, 8 );

	if( $prev_time ){
		$exectime = $mctime - $prev_time; // bcsub( $mctime, $prev_time, 8 );
		$collect  += $exectime; // bcadd( $collect, $exectime, 8 );
	}
	$prev_time = $mctime;

	if( 'pause' === $phase ){
		$prev_time = 0;
	}
	elseif( 'get' === $phase ){
		return round( $exectime, $round );
	}
	elseif( false !== strpos( 'getall end stop', $phase ) ){
		return round( $collect, $round );
	}
}

Если замеряете отдельные быстрые функции, например: __(), то можно повторять выполнение для наглядности. Например, замерим работу :

exec_time();

for( $i=1; $i<50000; $i++ ){
	$r = __( 'Settings', 'default' );
}

echo exec_time('get') .'сек.'; // 0.51650 сек.

empty() и объекты

Проверка empty() на объектах может вести себя странно. Допустим у нас есть некий объект и мы проверяем пусто ли свойство , и получаем такое:

if( empty( $obj->var ) ){
	// условие сработает
}

if( ! $obj->var ){
	// условие не сработает
}

Парадокс! Как такое может быть? empty() говорит что свойство пустое, а говорит что в нем что-то есть. Как одно и тоже свойство может быть пустым и не пустым одновременно? Квантовая суперпозиция господа…

Однако если разобраться, то нет тут ничего удивительного и все логично!

Дело в том, что конструкция empty() обращается к встроенному методу объекта __isset(), а прямой запрос к свойству $obj->var обратится к методу объекта __get().

Т.е. получается empty() и ! запрашивают разные методы, если свойство не установлено:

class FOO {

	function __get( $name ){
		if( $name == 'bar' ) return true;
	}

}

$obj = new FOO;

var_dump( empty( $obj->bar ) ); //> bool(true) - переменной нет

var_dump( ! $obj->bar );        //> bool(false) - переменная есть

А теперь, зададим значение свойства bar в __isset() и empty() его получит:

class FOO {

	function __isset( $name ){
		if( $name == 'bar' ) return true;
	}

	function __get( $name ){
		if( $name == 'bar' ) return true;
	}

}

$obj = new FOO;

var_dump( empty( $obj->bar ) ); //> bool(false) - переменная есть

var_dump( ! $obj->bar );        //> bool(false) - переменная есть
Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: