Статья в которой мы учимся и разбираем практические вопросы работы с массивами в языке программирования PHP.
Что такое массив
Массивы — это мощный тип данных в PHP. А умение быстро определять размер массива — полезный навык.
В этой статье я дам вам краткий обзор того, как работают массивы, а затем я расскажу, как получить размер массивов PHP.
Прежде чем мы углубимся в определение размера массива, нам нужно убедиться, что мы понимаем, что такое массив. Массив в PHP — это тип переменной, который позволяет хранить более одного фрагмента данных.
Например, если вы храните простую строку, вы должны использовать строковый тип PHP:
$heading = 'PHP Array Length Tutorial';
Однако, если вы хотите хранить еще несколько фрагментов отдельных данных, вы можете рассмотреть возможность использования дополнительных строковых переменных.
$heading = 'PHP Array Length Tutorial';
$subheading = 'How to get an array size';
$author = 'Jonathan Bossenger'
Это все хорошо, но что, если вам нужно сохранить больше данных и быстро вызвать любой из этих элементов в другом месте вашего кода? Вот здесь и пригодится массив. Вы по-прежнему можете хранить отдельные фрагменты данных, но с использованием одной переменной.
$post_data = array(
'PHP Array Length Tutorial',
'How to get an array size',
'Jonathan Bossenger'
);
На каждый элемент в этом массиве можно ссылаться по его числовому ключу. Таким образом, вместо того, чтобы вызывать отдельные переменные, вы можете ссылаться на один элемент массива по его числовому ключу.
echo $post_data[0];
В PHP ключи массива начинаются с 0 (нуля).
Для еще большего контроля массивы также позволяют вам определять свои собственные ключи массива, используя строки.
$post_data = array(
'heading' => 'PHP Array Length Tutorial',
'subheading' => 'How to get an array size',
'author' => 'Jonathan Bossenger'
);
Это позволяет вам также ссылаться на элемент массива по его строковому ключу.
echo $post_data['heading'];
Вы также можете определять массивы, используя новую нотацию коротких массивов, которая похожа на JavaScript:
$post_data = [
'heading' => 'PHP Array Length Tutorial',
'subheading' => 'How to get an array size',
'author' => 'Jonathan Bossenger'
];
Массивы также могут быть вложенными, образуя более сложные переменные массива:
$post_data = [
'heading' => 'PHP Array Length Tutorial',
'subheading' => 'How to get an array size',
'author' => [
'name' => 'Jonathan Bossenger',
'twitter' => 'jon_bossenger',
]
];
И вы можете вызвать конкретное значение массива, используя его вложенный ключ:
echo $post_data['author']['name'];
Однако, если вы регулярно делаете это, вы можете подумать об использовании объектов, а не массивов.
Массивы полезны, если вам нужно быстро собрать, а затем использовать различные фрагменты связанных данных в функции или передать эти данные другой функции.
Помещая эти фрагменты данных в массив, вы определяете меньше переменных, и это может облегчить чтение и понимание вашего кода в дальнейшем. Также намного проще передать одну переменную массива другой функции, чем передать несколько строк.
$post_data = [
'heading' => 'PHP Array Length Tutorial',
'subheading' => 'How to get an array size',
'author' => [
'name' => 'Jonathan Bossenger',
'twitter' => 'jon_bossenger',
]
];
$filtered_post_data = filter_post_data($post_data)
Список функций
Ниже в формате шпаргалки привожу Функции для работы с массивами в PHP и Описание этих функций.
implode
Объединяет элементы массива в строку
Разбивает строку с помощью разделителя (строку в массив)
array_chunk
Разбивает массив на несколько меньших массивов заданного размера
array_combine
Создает массив из двух заданных массивов — массива индексов элементов и массива значений
array_count_values
Формирует массив, индексами которого являются значения заданного массива, а значениями — число повторений соответствующего значения в заданном массиве
array_diff
Формирует массив из тех элементов первого заданного массива, которые отсутствуют в остальных заданных в качестве аргументов функции массива
array_fill
Заполняет массив заданным значением
array_intersect
Формирует массив из элементов, которые присутствуют во всех заданных массивах
array_key_exists
Проверяет наличие заданного индекса в массиве
array_keys
Возвращает массив из индексов заданного массива
array_merge
Объединяет несколько массивов в один
array_multisort
Выполняет сортировку многомерного массива или нескольких одномерных массивов
array_pad
Дополняет массив до заданного количества элементов заданным значением
array_pop
Возвращает последний элемент массива, одновременно удаляя элемент из массива
array_push
Добавляет заданные элементы в конец массива
array_rand
Выбирает один или несколько случайно взятых элементов из массива
array_reduce
Осуществляет последовательное применение заданной функции к элементам массива, формируя итоговое значение
array_reverse
Производит обращение массива — первый элемент становится последним, второй — предпоследним и т.д.
array_search
Ищет заданный элемент в массиве и возвращает соответствующим ему индекс
array_shift
Возвращает первый элемент массива, одновременно удаляя его из массива с перенумерацией числовых индексов
array_slice
Вырезает из массива подмассив заданной длины, начиная с указанного элемента
array_sum
Вычисляет сумму всех элементов массива
array_unique
Удаляет дублирующиеся значения из массива
array_unshift
Добавляет один или несколько элементов в начало массива с перенумерацией числовых индексов
array_walk
Вызывает заданную функцию последовательно для каждого элемента массива
array_walk_recursive
Рекурсивно применяет пользовательскую функцию к каждому элементу массива
array
Создает массив из заданных значений или пар индекс — значение
arsort
Сортирует массив по убыванию его значений, сохраняя индексы неизменными
assort
Сортирует массив по возрастанию его значений, сохраняя индексы неизменными
krsort
Сортирует массив по убыванию его индексов
ksort
Сортирует массив по возрастанию его индексов
sort
Сортирует массив по возрастанию значений его элементов с перенумерацией его индексов
usort
Сортирует массив с использование заданной функции сравнения элементов массива
rsort
Сортирует массив по убыванию значений его элементов с перенумерацией его индексов
natcasesort
Сортирует массив естественным образом без учета регистра массива
natsort
Сортирует массив естественным образом с учетом регистра символов
count
Возвращает количество элементов в массиве
current
Возвращает значение текущего элемента массива
each
Возвращает текущие индекс и значение элемента массива и продвигает указатели на следующий элемент
in_array
Проверяет, присутствует ли заданное значение в массиве
key
Возвращает индекс текущего элемента массива
list
Присваивает значения из массива списку переменных
pos
Синоним функции current
reset
Устанавливает внутренний указатель на первый элемент массива
shuffle
Переставляет элементы массива случайным образом
sizeof
Синоним функции count
Определяем первый и последний элемент в цикле foreach
Цикл foreach()
в PHP используется для прохождения в цикле по блоку кода для каждого элемента массива. Разберемся как использовать цикл foreach()
и как получить первый и последний элементы массива.
Синтаксис PHP foreach()
Цикл foreach()
в основном используется для итерации по каждому значению массива.
Пример цикла foreach()
:
foreach($array as $key => $value){
// Код пишем сюда
}
Значения параметров foreach()
:
$array
— это должен быть корректный массив для использования в цикле; если переданный массив не корректен или является строкой, возвращается ошибка вида: (Warning: Invalid argument supplied for foreach())$key
— это ключ элемента на каждой итерации$value
— значение элемента на каждой итерации
Получаем первый и последний элемент в цикле foreach() в PHP
Существует несколько подходов к получению первого и последнего элемента в цикле с помощью PHP, и они различаются для разных версий языка.
Первый — это использование счетчика (работает для всех версий PHP), второй — использование функций array_key_first()
и array_key_last()
для версии PHP 7.3 и старше.
Использование счетчика в цикле foreach
Добавление целочисленной переменной и размещение счетчика в нижней части цикла foreach().
Пример:
$array = array("dog", "rabbit", "horse", "rat", "cat");
$x = 1;
$length = count($array);
foreach($array as $animal){
if($x === 1){
//first item
echo $animal; // output: dog
}else if($x === $length){
echo $animal; // output: cat
}
$x++;
}
В приведенном выше примере список животных хранится в виде массива $array
.
Затем устанавливаем $x
равным 1, чтобы запустить счетчик.
Используем функцию count()
для определения общей длины массива. Итерация счетчика была размещена в нижней части цикла foreach() для выполнения условия получения первого элемента и выглядит так: $x++;
.
Чтобы получить последний элемент, проверьте, равен ли $x
общей длине массива. Если это так, то будет получен последний элемент.
Использование array_key_first() и array_key_last() в цикле PHP
В последних версиях PHP получение первого и последнего элемента в массиве может быть как никогда эффективным.
Пример:
$array = array("dog", "rabbit", "horse", "rat", "cat");
foreach($array as $index => $animal) {
if ($index === array_key_first($array))
echo $animal; // output: dog
if ($index === array_key_last($array))
echo $animal; // output: cat
}
В приведенном выше примере array_key_first()
получает ключ первого элемента массива, в данном случае это 0.
Затем array_key_last()
получает последний ключ массива, в данном случае 5.
Если просмотреть массив, то элемент, который находится в ключе 0, — это собака, которая является первой, а в ключе 5 — это кошка, которая является последним элементом.
Изменение последнего элемента массива get_the_terms в WordPress
В WordPress бывают ситуации когда нужно определить последний элемент массива get_the_terms
. Например, если нам надо перебрать все таксономии и после каждой таксономии поставить запятую. Но нам нужна запятая во всех кроме последней таксономии.
Способы, которые были показаны выше можно объединить и получим следующий сниппет для нашего случая:
<?php
$cur_terms = get_the_terms( $post->ID, 'types' );
$x = 0;
if( is_array( $cur_terms ) ){
foreach( $cur_terms as $cur_term ){
if ($x === array_key_last($cur_terms)) {
echo '<a href="'. get_term_link( $cur_term->term_id, $cur_term->taxonomy ) .'">'. $cur_term->name .'</a>' . '';
} else {
echo '<a href="'. get_term_link( $cur_term->term_id, $cur_term->taxonomy ) .'">'. $cur_term->name .'</a>' . ', ';
}
$x++;
}
}
Важно, что get_the_terms
возвращает массив объектов. По этой причине мы используем счетчик и сравниваем его с array_key_last()
.
В примере выше видно, что если счетчик равен array_key_last()
, то запятая после таксономии не ставится.
Размер массива
Обычно, когда мы говорим о размере массива, мы говорим о том, сколько элементов существует в этом массиве. Есть два распространенных способа получить размер массива.
Самый популярный способ — использовать функцию PHP count()
. Как сказано в названии функции, count()
вернет количество элементов массива. Но то, как мы используем функцию count()
, зависит от структуры массива.
Давайте посмотрим на два примера массивов, которые мы определили ранее.
$post_data = array(
'heading' => 'PHP Array Length Tutorial',
'subheading' => 'How to get an array size',
'author' => 'Jonathan Bossenger'
);
echo count($post_data);
В этом примере count($post_data)
приведет к 3. Это связано с тем, что в этом массиве есть 3 элемента: «заголовок», «подзаголовок» и «автор». Но как насчет нашего второго примера вложенного массива?
$post_data = [
'heading' => 'PHP Array Length Tutorial',
'subheading' => 'How to get an array size',
'author' => [
'name' => 'Jonathan Bossenger',
'twitter' => 'jon_bossenger',
]
];
echo count($post_data);
Вы не поверите, но в этом примере count($post_data)
также вернет 3. Это связано с тем, что по умолчанию функция count()
считает только элементы массива верхнего уровня.
Если вы посмотрите на определение функции, вы увидите, что оно принимает два аргумента — массив для подсчета и mode
. Значением по умолчанию для этого режима является предопределенная константа COUNT_NORMAL
, которая сообщает функции, что она должна подсчитывать только элементы массива верхнего уровня.
Если вместо этого мы передадим предопределенную константу COUNT_RECURSIVE
, она пройдет через все уровни вложенности и будет их также считать.
$post_data = [
'heading' => 'PHP Array Length Tutorial',
'subheading' => 'How to get an array size',
'author' => [
'name' => 'Jonathan Bossenger',
'twitter' => 'jon_bossenger',
]
];
echo count($post_data, COUNT_RECURSIVE);
Теперь результатом count($post_data, COUNT_RECURSIVE)
будет, как и ожидалось, 5.
«Но подождите!» — слышу ваше недоумение. «Вы упомянули, что есть другой способ?».
Да, вы можете использовать еще одну функцию — sizeof(). Однако sizeof()
— это просто псевдоним count()
, и многие люди правильно предполагают, что sizeof()
вернет использование памяти массивом.
Поэтому лучше использовать count()
, которая является более подходящим названием для того, что вы делаете — подсчета элементов в массиве.