Массивы в PHP

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

PHP
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

Объединяет элементы массива в строку

explode

Разбивает строку с помощью разделителя (строку в массив)

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(), которая является более подходящим названием для того, что вы делаете — подсчета элементов в массиве.

Опубликовано 16 января 2023 в 03:01
Обновлено 9 января 2024 в 14:12
Категория: Блог
Теги: