Sdscompany.ru

Компьютерный журнал
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Определить количество элементов в массиве php

count

(PHP 4, PHP 5, PHP 7)

count — Подсчитывает количество элементов массива или чего-либо в объекте

Описание

Подсчитывает количество элементов массива или чего-то в объекте.

Для объектов, если у вас включена поддержка SPL, вы можете перехватить count() , реализуя интерфейс Countable. Этот интерфейс имеет ровно один метод, Countable::count() , который возвращает значение функции count() .

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

Список параметров

Массив или объект, реализующий Countable.

Если необязательный параметр mode установлен в COUNT_RECURSIVE (или 1), count() будет рекурсивно подсчитывать количество элементов массива. Это особенно полезно для подсчёта всех элементов многомерных массивов.

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

Возвращаемые значения

Возвращает количество элементов в array_or_countable . Если параметр не является массивом или объектом, реализующим интерфейс Countable, будет возвращена 1. За одним исключением: если array_or_countable — NULL , то будет возвращён .

Примеры

Пример #1 Пример использования count()

Результат выполнения данного примера:

Пример #2 Пример рекурсивного использования count()

array( ‘orange’ , ‘banana’ , ‘apple’ ),
‘veggie’ => array( ‘carrot’ , ‘collard’ , ‘pea’ ));

// рекурсивный подсчет
echo count ( $food , COUNT_RECURSIVE ); // выводит 8

// обычный подсчет
echo count ( $food ); // выводит 2

Список изменений

Смотрите также

  • is_array() — Определяет, является ли переменная массивом
  • isset() — Определяет, была ли установлена переменная значением, отличным от NULL
  • empty() — Проверяет, пуста ли переменная
  • strlen() — Возвращает длину строки
  • is_countable() — Проверить, что содержимое переменной является счетным значением

User Contributed Notes 16 notes

[Editor’s note: array at from dot pl had pointed out that count() is a cheap operation; however, there’s still the function call overhead.]

If you want to run through large arrays don’t use count() function in the loops , its a over head in performance, copy the count() value into a variable and use that value in loops for a better performance.

My function returns the number of elements in array for multidimensional arrays subject to depth of array. (Almost COUNT_RECURSIVE, but you can point on which depth you want to plunge).

For a Non Countable Objects

$count = count($data);
print «Count: $countn»;

Warning: count(): Parameter must be an array or an object that implements Countable in example.php on line 159

#Quick fix is to just cast the non-countable object as an array..

$count = count((array) $data);
print «Count: $countn»;

to end the debate: count() is the same as empty()

test code below:

results on my computer:

count : double(0.81396999359131)
empty : double(0.81621310710907)

using isset($test[0]) is a bit slower than empty;
test without adding value to the array in function ****Test: still the same.

You can not get collect sub array count when there is only one sub array in an array:

$a = array ( array (‘a’,’b’,’c’,’d’));
$b = array ( array (‘a’,’b’,’c’,’d’), array (‘e’,’f’,’g’,’h’));

echo count($a); // 4 NOT 1, expect 1
echo count($b); // 2, expected

All the previous recursive count solutions with $depth option would not avoid infinite loops in case the array contains itself more than once.
Here’s a working solution:

// you need to unset it when done because you’re working with a reference.
unset( $arr [ ‘__been_here’ ]);
return $count ;
>
?>

If you are on PHP 7.2+, you need to be aware of «Changelog» and use something like this:

You can organize your code to ensure that the variable is an array, or you can extend the Countable so that you don’t have to do this check.

Get maxWidth and maxHeight of a two dimensional array.

Note:
1st dimension = Y (height)
2nd dimension = X (width)
e.g. rows and cols in database result arrays

So for Y (maxHeight)

And for X (maxWidth)

I actually find the following function more useful when it comes to multidimension arrays when you do not want all levels of the array tree.

If you want to know the sub-array containing the MAX NUMBER of values in a 3 dimensions array, here is a try (maybe not the nicest way, but it works):

function how_big_is_the_biggest_sub ($array) <
// we parse the 1st level
foreach ($array AS $key => $array_lvl2) <
//within level 2, we count the 3d levels max
$lvl2_nb = array_map( ‘count’, $array_lvl2) ;
$max_nb = max($lvl2_nb);
// we store the matching keys, it might be usefull
$max_key = array_search($max_nb, $lvl2_nb);
$max_nb_all[$max_key.’|’.$key] = $max_nb;
>
// now we want the max from all levels 2, so one more time
$real_max = max($max_nb_all);
$real_max_key = array_search($real_max, $max_nb_all);
list($real_max_key2, $real_max_key1) = explode(‘|’, $real_max_key);
// preparing result
$biggest_sub[‘max’] = $real_max;
$biggest_sub[‘key1’] = $real_max_key1;
$biggest_sub[‘key2’] = $real_max_key2;

return $biggest_sub;
>
/*
$cat_poids_max[‘M’][‘Juniors’][] = 55;
$cat_poids_max[‘M’][‘Juniors’][] = 61;
$cat_poids_max[‘M’][‘Juniors’][] = 68;
$cat_poids_max[‘M’][‘Juniors’][] = 76;
$cat_poids_max[‘M’][‘Juniors’][] = 100;

$cat_poids_max[‘M’][‘Seniors’][] = 55;
$cat_poids_max[‘M’][‘Seniors’][] = 60;
$cat_poids_max[‘M’][‘Seniors’][] = 67;
$cat_poids_max[‘M’][‘Seniors’][] = 75;
$cat_poids_max[‘M’][‘Seniors’][] = 84;
$cat_poids_max[‘M’][‘Seniors’][] = 90;
$cat_poids_max[‘M’][‘Seniors’][] = 100;
//.
$cat_poids_max[‘F’][‘Juniors’][] = 52;
$cat_poids_max[‘F’][‘Juniors’][] = 65;
$cat_poids_max[‘F’][‘Juniors’][] = 74;
$cat_poids_max[‘F’][‘Juniors’][] = 100;

$cat_poids_max[‘F’][‘Seniors’][] = 62;
$cat_poids_max[‘F’][‘Seniors’][] = 67;
$cat_poids_max[‘F’][‘Seniors’][] = 78;
$cat_poids_max[‘F’][‘Seniors’][] = 86;
$cat_poids_max[‘F’][‘Seniors’][] = 100;
*/
$biggest_sub = how_big_is_the_biggest_sub($cat_poids_max);
echo »
«.$biggest_sub[‘key1’].» ==> «.$biggest_sub[‘key2’].» ==> «.$biggest_sub[‘max’]; // displays : M ==> Seniors ==> 7

Как найти количество уникальных элементов в массиве

Условие задачи 2.99

Задача 2.99
Дан одномерный массив А неупорядоченных целых чисел. Вывести на экран количество уникальных элементов в массиве.

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

Читать еще:  Php if then

Но в этом и смысл задач — учиться искать решения.

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

То есть массив А содержит числа, а в массив В я буду записывать индексы массива А совпадающих (не уникальных) элементов. Для уникальных элементов индексы в массиве В будут равны нулю. Таким образом, после поиска совпадений, у меня получится массив В такой же размерности, как и исходный массив. Но элементы с нулевым значением в массиве В будут соответствовать уникальным элементам в массиве А. И, подсчитав нулевые элементы в массиве В, мы сможем определить количество уникальных элементов в массиве А.

Сложновато? Ну да, не очень красиво. Но это первое решение, которое пришло в голову. Обычно программы так и пишутся:

  • Сначала быстро создаётся версия, которая будет хоть как-то работать, чтобы можно было побыстрее начать её использовать.
  • А потом выпускаются новые версии с доработками. И так до бесконечности.

ПРИМЕЧАНИЕ
В примерах я использую глобальные массивы, хотя это и не очень приветствуется. Обычно стараются в таких случаях передавать массивы в функцию в качестве параметра. Однако в этом случае новички могут столкнуться с трудностями, преодоление которых описано здесь.

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

Примеры программ на Паскале и С++.

ПРИМЕЧАНИЕ
Программа на С++ несколько отличается от программы на Паскале. Во-первых, вместо выделения цветом я использовал знак * для обозначения одинаковых чисел (потому как в С++ использовать цвет сложнее, чем в Паскале, если хотите знать как — читайте мою книгу “Основы С++”). Во-вторых, в С++ индексация массивов начинается с нуля, поэтому мы не можем использовать ноль в массиве В, и применяем -1. Есть и другие особенности, но о них я уже говорить не буду.

ВНИМАНИЕ!
Если вам что-то осталось непонятно, то советую почитать книги “Основы программирования” и “Основы С++”.

Основы C++

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

Массивы и списки в PHP

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

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

Массивы, индексами которых являются строки, называются ассоциативными. Индексы ассоциативных массивов называются ключами. Пример ассоциативного массива:

$People[«Иванов»]=»Иван»;
$People[«Сидоров»]=»Николай»;
$People[«Петров»]=»Петр»;

Доступ к элементам ассоциативных массивов осуществляется так же, как и к элементам обыкновенных массивов, и называется доступом по ключу:

echo $People[«Иванов»];

Списки в PHP

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

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

Вот пример автоматического создания массива:

$People[]=»Коля»;
$People[]=»Витя»;
$People[]=»Дима»;

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

Как видите все просто и удобно — не нужно указывать индексы. Однако, это как раз тот случай, когда мы не знаем точного числа элементов в массиве.

Соответственно, при работе с такими массивами целесообразно использовать функцию count(), которая определяет количество элементов в массиве.

Рассмотрим небольшой пример — чтение текстового файла в массив. Функция fopen() используется для открытия файла, функция feof() истинна, если достигнут конец файла, а функция fgets() читает строку из файла.

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

Массивы в PHP

Массив — это упорядоченный набор данных. Каждый элемент массива имеет индекс или ключ. Индекс (ключ) служит для однозначной идентификации элемента внутри массива. В одном массиве не может быть двух элементов с одинаковыми индексами.

Работать без массива не очень удобно, думаю, вы и сами это понимаете. Существует ряд задач, где без использования массива просто не обойтись. Примером может послужить простой список друзей. Не будете же вы создавать 20 переменных, содержащих имена ваших друзей? Гораздо рациональнее создать один массив, содержащий 20 элементов.

Если вы программировали на C или Pascal, то знаете, что длина массива ограничена. При этом, если вы наперед не знаете, сколько элементов будет содержать ваш массив, значит вам нужно использовать динамические структуры (список, стек, очередь). В PHP все гораздо проще — длину массива не нужно задавать при объявлении массива, длина будет автоматически увеличена при добавлении нового элемента в массив. Все это становится возможным только благодаря тому, что PHP — интерпретатор, а не компилятор.

Читать еще:  Html format number

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

Рассмотрим простейший способ инициализации массива:

$People[0]=»Коля»;
$People[1]=»Витя»;
$People[2]=»Дима»;
$People[3]=»Марк»;

PHP узнает о том, что создается массив по квадратным скобкам. В квадратных скобках указывается индекс (ключ) отдельного элемента массива. В приведенном примере мы объявили массив $People, состоящий из четырех элементов. Однако в дальнейшем нам никто не помешает инициализировать еще один (или сколько нужно) новый элемент массива. В PHP размер массива не задается явно, как в других языках программирования.

Обратиться к элементу массива можно по имени массива и индексу элемента внутри массива:

echo $People [1];

Зная количество элементов массива, мы можем вывести все элементы массива с помощью цикла:

for ($i=0; $i

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

Определить количество элементов в массиве php

Меняет местами индексы и значения массива.
Синтаксис:

Эта функция «пробегает» по массиву и меняет местами его ключи и значения. Исходный массив arr не изменяется, а результирующий массив просто возвращается. Если в массиве присутствовало несколько элементов с одинаковыми значениями, учитываться будет только последний из них.

Значения массива arr должны быть либо целыми числами, либо строковыми значениями. Иначе пара ключ / значение не будут обработаны.

Функция array_flip() возвратит FALSE, если обработка массива вызвала ошибку.

Пример использования функции array_flip():

Пример использования функции array_flip():

Приведенный выше пример выведет следующее:

Функция поддерживается PHP 4, PHP 5

Функция устанавливает значения ключей массива в верхний или нижний регистр.
Синтаксис:

Функция array_change_key_case() возвращает исходный массив arr, ключи которого преобразованы в верхний или нижний регистр.
Необязательный параметр registr может принимать следующие значения:
CASE_LOWER — все ключи массива преобразуются в нижний регистр (значение по умолчанию);
CASE_UPPER — в верхний регистр.
Данная функция не изменяет ключи, состоящие из чисел.
Пример использования функции array_change_key_case():

Пример выведет следующее:

Функция поддерживается PHP 4 >= 4.2.0, PHP 5

Функция объединяет два массива, причем значения первого становяться ключами, а значения второго — значениями.
Синтаксис:

Функция array_combine() возвращает массив, ключами которого являются значения массива keys, а значениями — значения массива values.
Функция возвратит FALSE, если размерность массивов keys и values не совпадают, или эти массивы не содержат значений.
Пример использования функции array_combine():

Пример выведет следующее:

Функция поддерживается PHP 5

Проверка существования заданного ключа в массиве.
Синтаксис:

Функция array_key_exists() возвратит TRUE, если в массиве search присутствует элемент с индексом key.
В противном случае возвратит FALSE.

Пример использования функции array_key_exists():

В PHP 4.0.6. имя этой функции key_exists().

Функция поддерживается PHP 4 >= 4.0.1, PHP 5

Вычислить произведение значений массива (PHP 5 >= 5.1.0RC1)

array_product() возвращает произведение значений массива как целое число или число с плавающей точкой.

Пример использования array_product()

Результат выполнения данного примера:

Итеративно уменьшить массив к единственному значению, используя функцию обратного вызова (PHP 4 >= 4.0.5, PHP 5)

array_reduce() итеративно применяет функцию function к элементам массива input и, таким образом, сводит массив к единственному значению. Если указан дополнительный параметр initial, он будет использован в начале процесса, или в качестве окончательного результата, если массив пуст.

В результате переменная $b содержит 15, $c содержит 1200 (= 1*2*3*4*5*10), и $d содержит 1.

Рекурсивно применить пользовательскую функцию к каждому элементу массива (PHP 5)

Применяет пользовательскую функцию funcname к каждому элементу массива input. Эта функция обрабатывает каждый элемент многомерного массива. Обычно у функции funcname два параметра. Значение массива array в качестве первого параметра, и ключ/индекс в качестве второго. Если указан дополнительный параметр userdata, он будет передан в качестве третьего параметра в функцию обратного вызова funcname.

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Замечание: Если требуется, чтобы функция funcname изменила значения в массиве, определите первый параметр funcname как ссылку. Тогда все изменения будут применены к элементам массива.

Пример использования array_walk_recursive()

Вывод вышеприведённой программы:

Обратите внимание, что ключ ‘sweet’ никогда не отображается. Никакой ключ, соответствующий значению типа array, не будет передан в функцию.

Возвращает список из ключей массива.
Синтаксис:

Функция возвращает массив, значениями которого являются все строковые и числовые ключи массива arr. Если задан необязательный параметр search_value, то она вернет только те ключи, которым соответствуют значению search_value.
Пример испольльзования функции array_keys():

Приведенный выше пример выведет следующее:

Функция array_keys() появилась в PHP 4.

Ее эквивалент для PHP 3:

Функция поддерживается PHP 4, PHP 5

Удаление ассоциативных индексов массива.
Синтаксис:

Функция array_values() возвращает список всех значений в ассоциативном массиве arr. При этом она заменяет все строковые ключи на числовые.
Пример использования функции array_values():

Этот пример выведет:

Функция поддерживается PHP 4, PHP 5

Осуществляет проверку массива на наличие значения.
Синтаксис:

Функция in_array() возвратит TRUE, если в массиве haystack содержится элемент со значением needle, и FALSE в противном случае.
Если установить третий необязательный параметр strict в значение TRUE, то функция in_array() при проверке также будет сравнивать типы значений.
Замечание: Если параметр needle является строкой, то при сравнении регистр символов учитывается.
Замечание: В PHP версии ниже 4.2.0 параметр needle не мог быть массивом.
Пример использования функции in_array():

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

Читать еще:  Php поиск по базе mysql

Пример использования функции in_array(): Использование параметра strict

Функция поддерживается PHP 4, PHP 5

Возвращает количество значений массива.
Синтаксис:

Эта функция подсчитывает, сколько раз каждое значение встречается в массиве arr, и возвращает ассоциативный массив с ключами —
элементами массива и значениями — количеством повторов этих элементов. Иными словами, функция array_count_values()
подсчитывает частоту появления значений в массиве arr.
Пример использования функции array_count_values():

Пример выведет следующее:

Функция поддерживается PHP 4, PHP 5

Возвращает число элементов массива.
Синтаксис:

Функция sizeof() возвращает количество элементов в массиве arr на подобие действия функции count().

Возвращает число элементов в массиве или объекте.
Синтаксис:

Функция count() возвращает число элементов в массиве или объекте var. В случае, если var — скалярная переменная, то функция возвращает 1, если такая переменная существует, или 0, если такой переменной нет.
Надо отметить, что 0 возвращается и тогда, когда указан массив, не содержащий элементов (NULL).

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

Пример использования функции count(): (PHP >= 4.2.0)

Функция поддерживается PHP 3, PHP 4, PHP 5

Возвращает сумму всех элементов массива.
Синтаксис:

Функция array_sum() возвращает сумму всех числовых элементов массива. От типа значений в массиве зависит тип возвращаемого числа (integer или float).

Пример использования функции array_sum():

Этот пример выведет следующее:

Функция поддерживается PHP 4 >=4.0.4, PHP 5

Производит случайную выборку индексов массива.
Синтаксис:

Функция array_rand() будет полезной, если вы хотите выбрать одно или несколько случайных значений из массива. Эта функция возвращает в массиве выбранные случайным образом индексы элементов массива arr.
Аргумент num_req указывает число возвращаемых индексов. В случае, если выбирается один элемент, то функция array_rand() возвратит случайный ключ в виде значения.
Пример использования функции array_rand():

Использование многомерных массивов в PHP

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

В данном уроке рассматриваются многомерные (вложенные) массивы PHP. Объясняется, как их создать, как ими манипулировать, как организовать цикл по всему многомерному массиву в PHP.

Как создать многомерный массив

Создать многомерный массив можно с помощью конструкции array() , что очень похоже на создание обычного массива. Разница заключается в том, что в многомерном массиве каждый элемент также является массивом.

В выше приведённом примере создаётся двумерный массив. Массив верхнего уровня содержит 3 элемента. Каждый элемент также является массивом, содержащим 3 значения.

Также можно использовать ассоциативный массив в качестве многомерного массива. Следующий пример демонстрирует создание индексированного массива, который содержит 3 ассоциативных массива:

Можно вкладывать массивы один в другой настолько глубоко, насколько нужно (хотя на практике глубина вложенности редко бывает больше 3-х уровней). В примере ниже демонстрируется 3-х мерный массив:

Доступ к элементам в многомерном массиве

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

А вот пример, который демонстрирует доступ к различным элементам многомерного массива $movies , который мы создали раньше:

Выполнение кода выдаст следующий результат:

Последний пример использует $movies[0] для организации доступа ко всему вложенному массиву в первом элементе массива верхнего уровня, а затем используется функция print_r() для вывода содержимого массива.

Организация перебора всех элементов многомерного массива в цикле

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

  1. Внешний цикл берет каждый элемент массива верхнего уровня..
  2. Для каждого элемента верхнего уровня внутренний цикл перебирает вложенный массив, и так далее.

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

Выполнение данного кода выдаст следующий результат:

Резюме

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

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.elated.com/articles/php-multidimensional-arrays/
Перевел: Сергей Фастунов
Урок создан: 30 Июля 2010
Просмотров: 144073
Правила перепечатки

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

Фильтрация данных с помощью zend-filter

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

Контекстное экранирование с помощью zend-escaper

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

Подключение Zend модулей к Expressive

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

Совет: отправка информации в Google Analytics через API

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

Подборка PHP песочниц

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

Ссылка на основную публикацию
Adblock
detector