Полезные функции для работы с массивами в PHP

Функции php для работы с массивамиДавно я не писал в бложек. Работа и учеба не дают покоя. Последнее время получаю много заказов на PHP, и частенько приходится работать с массивами данных. Знания мои в PHP не изумительные, поэтому постоянно лезу в документацию. Сегодня пришла в голову мысль — написать себе мини-шпаргалку с полезными функциями для работы с массивами в PHP. Думаю, эта шпаргалка пригодится не только мне.

Самая часто используемая функция на мой взгляд — это count(«массив»). Функция count возвращает количество элементов в массиве. Пример работы:

	$myArr = array("John", "Ivan", "Oleg");
	echo count($myArr);

На самом деле, функция count может работать не только с массивами, но и с обыкновенными переменными, а так же с многомерными массивами. Приведу еще парочку примеров:

	$myArr = array(array(1, 2, 3), array(1, 2), 3);
	echo count($myArr); //Выведет 3
	echo count($myArr, COUNT_RECURSIVE); //Выведет общее количество элементов (8)

	$myVar = "Ivan";
	echo count($myVar); //Выведет 1

	echo count(NULL); //Выведет 0

Если кто не понял, почему count($myArr, COUNT_RECURSIVE) возвращает 8 — объясняю. Массив $myArr состоит из 3-х элементов (два массива и одно число). Первый элемент массива $myArr — это массив из 3 элементов. Значит всего элементов уже 6. Прибавляем сюда еще два элемента из второго массива и получаем 8.

Идем дальше. Следующая полезная функция — in_array(«искомое значение», «массив», [«совпадение по типу»]). Функция in_array ищет элемент по искомому значению в переданном ей массиве. Если находит — возвращает TRUE, в противном случае FALSE. Третий аргумент отвечает за необходимость совпадения по типу. Если он установлен в TRUE — значит, искомое значение должно совпадать не только по значению, но и по типу. Кроме того, сравнение строк — чувствительно к регистру. Примеры:

	$myArr = array("Abc", "3", 2);

	echo in_array("Abc", $myArr); //Выведет 1
	echo in_array("abc", $myArr); //Ничего не выведет
	echo in_array("2", $myArr); //Выведет 1
	echo in_array("2", $myArr, TRUE); //Ничего не выведет

Двигаемся дальше. Функция array_search(«искомое значение», «массив», [«совпадение по типу»]) аналогична предыдущей, только в случае успеха — возвращает значение ключа массива. Примеры:

	$myArr = array("Abc", "3", 2);

	echo array_search("Abc", $myArr); //Выведет 0
	echo array_search("abc", $myArr); //Ничего не выведет
	echo array_search("2", $myArr); //Выведет 2
	echo array_search("2", $myArr, TRUE); //Ничего не выведет

Ничего сложного. Следующей гости нашей статьи это array_values(«массив») и array_keys(«массив»). Не трудно догадаться, как они работают. Функция array_values возвращает новый массив, содержащий все значение переданного ей массива, а array_keys — ключи, переданного ей массива. Примеры:

$myArr = array("A" => 1, "B" => 2, "C" => 3);

$valuesArr = array_values($myArr);
$keysArr = array_keys($myArr);

print_r($valuesArr);
print_r($keysArr);

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

Array ( [0] => 1 [1] => 2 [2] => 3 ) Array ( [0] => A [1] => B [2] => C ).

Идем дальше. Функции сортировки массивов. Первой рассмотрим sort(«массив», [«флаги»]). Сортирует массив по возрастанию, или по алфавиту, если это строка. В качестве дополнительных флагов можно задать следующие параметры: SORT_REGULAR (обычное сравнение элементов), SORT_NUMERIC (числовое сравнение элементов), SORT_STRING (строковое сравнение элементов). Подробнее можно прочитать в официальной документации, по вот этой ссылке. Примеры использования функции:

$myArr = array(10, 1, 12, 13, 2, 3, 11, 100);

print_r($myArr);
echo '<br />';

sort($myArr);

print_r($myArr);
echo '<br />';

sort($myArr, SORT_STRING);

print_r($myArr);
echo '<br />';

Результат работы:

Array ( [0] => 10 [1] => 1 [2] => 12 [3] => 13 [4] => 2 [5] => 3 [6] => 11 [7] => 100 )
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 10 [4] => 11 [5] => 12 [6] => 13 [7] => 100 )
Array ( [0] => 1 [1] => 10 [2] => 100 [3] => 11 [4] => 12 [5] => 13 [6] => 2 [7] => 3 )

Все просто, не так ли? Есть аналогичная функция, но сортирует она в обратном порядке — rsort(«массив», [«флаги»]). А так же еще две функции, выполняющие аналогичные действия, но при этом они сохраняют значения ключей. Это asort(«массив», [«флаги»]) — простая сортировка с сохранением ключей и arsort(«массив», [«флаги»]) — сортировка в обратном порядке, с сохранением ключей. Аналогичный пример работы функций asort и arsort:

$myArr = array(10, 1, 12, 13, 2, 3, 11, 100);

print_r($myArr);
echo '<br />';

asort($myArr);

print_r($myArr);
echo '<br />';

arsort($myArr);

print_r($myArr);
echo '<br />';

Результат работы немного другой:

Array ( [0] => 10 [1] => 1 [2] => 12 [3] => 13 [4] => 2 [5] => 3 [6] => 11 [7] => 100 )
Array ( [1] => 1 [4] => 2 [5] => 3 [0] => 10 [6] => 11 [2] => 12 [3] => 13 [7] => 100 )
Array ( [7] => 100 [3] => 13 [2] => 12 [6] => 11 [0] => 10 [5] => 3 [4] => 2 [1] => 1 )

Обратите внимание, что в этом примере я не использовал флаг SORT_STRING. Кроме этих функций, существует возможность сортировка массива по ключам. Для этого есть функции ksort(«массив», [«флаги»]) и krsort(«массив», [«флаги»]), которые работают аналогично, поэтому обойдемся без примера :).

А что если я хочу отсортировать массив каким-либо своим способом? В этом мне могут помочь функции usort(«массив», «функция») и uksort(«массив», «функция»), которые выполняют сортировку в соответствии пользовательской функции сравнения элементов. То есть, программист должен описать функцию, которая будет сравнивать элементы массива по очереди, а сами usort или uksort будут располагать элементы в массиве, в зависимости от результатов сравнения. Пример немного посложнее. Сначала объясню устройство массива. Он будет состоять из массивов, содержащих строку и число. Например, вот такой:

$myArr = array(array(1, "String1"), array(2, "String2"), array(3, "String3"));

Теперь поменяем элементы местами и отсортируем его по первому элементу внутренних массивов. Код:

//Наш массив
$myArr = array(array(2, "String2"), array(3, "String3"), array(1, "String1"));

//Функция сравнения элементов
function compare($a, $b) {
	if ($a[1] < $b[1])
		return -1;
	elseif ($a[1] > $b[1])
		return 1;
	return 0;
}
//Сортируем массив
usort($myArr, "compare");
//Выводим на экран
print_r($myArr);

Результат работы программы:

Array ( [0] => Array ( [0] => 1 [1] => String1 ) [1] => Array ( [0] => 2 [1] => String2 ) [2] => Array ( [0] => 3 [1] => String3 ) )

Как видите ничего сложного. Массив сортируется по первому элементу внутреннего массива. Функция сравнения может возвращать 3 значения. Если «положительное» — значит, функция сортировка считает, что первый элемент больше второго, если «отрицательное» — значит наоборот и если «0» — значит, элементы равны. Функция ursort работает также, только сортирует в обратном порядке. Кстати, можно отсортировать по убыванию, используя usort, просто задав правильную функцию сравнения для этого случая.

Дальше нас ждет array_walk(«массив», «функция», [«дополнительный аргумент»]). Эта функция пробегается по массиву, передавая пару значения и ключа в пользовательскую функцию. Дополнительный аргумент, если он задан, передастся в качестве третьего в пользовательскую функцию. Если ошибок во время работы не возникло — вернет TRUE, иначе — FALSE. Рассмотрим пример, что бы было понятнее:

$myArr = array('A' => 'Ivan', 'B' => 'John', 'C' => 'Bob');

function walker_function($value, $key, $additional) {
	echo $key.' '.$additional.' '.$value.'<br />';
}

array_walk($myArr, "walker_function", "is");

Результатом будет:

A is Ivan

B is John

C is Bob

Прошу заметить. Что бы можно было изменять элементы массива, нужно передавать их по ссылке. Например, вот таким вот образом:

function walker_function(&$value, $key, $additional) {
	$value = $key;
}

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

Следующая функция вытаскивает под массив из массива. Синтаксис прост array_slice(«массив», «номер элемента», [«длина»]). С аргументами, думаю все понятно: из заданного массива извлекается новый массив с аргумента «номер элемента» до конца массива, если не задан аргумент «длина». Приведу пример:

$myArr = array(1, 2, 3, 4, 5);
$newArr1 = array_slice($myArr, 3);
$newArr2 = array_slice($myArr, 2, 2);

print_r($myArr);
echo '<br />';
print_r($newArr1);
echo '<br />';
print_r($newArr2);
echo '<br />';

Результат работы:

Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )
Array ( [0] => 4 [1] => 5 )
Array ( [0] => 3 [1] => 4 [2] => 5 )

Есть еще одна аналогичная функция array_chunk(«массив», «размер», [«сохранять ключи»]). Данная функция возвращает многомерный массив, состоящий из полученных массивов заданного размера. Если задан булевый флаг «сохранять ключи» полученные значения массивов будут с теми ключами, которые у них были изначально, если нет — все значения получаю обыкновенные цифровые ключи. Пример работы:

$myArr = array('A' => 1, 'B' => 2, 'C' => 3, 'D' => 4, 'E' => 5, 'F' => 7, 'G' => 8);

$resultArr = array_chunk($myArr, 2, true);

print_r($resultArr);

Результат работы:

Array ( [0] => Array ( [A] => 1 [B] => 2 ) [1] => Array ( [C] => 3 [D] => 4 ) [2] => Array ( [E] => 5 [F] => 7 ) [3] => Array ( [G] => 8 ) )

Вот и все. Задавайте свои ответы, пишите отзывы и комментарии. Надеюсь, статья будет кому-то полезной.

Комментарии 4

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *