Давно я не писал в бложек. Работа и учеба не дают покоя. Последнее время получаю много заказов на 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 ) )
Вот и все. Задавайте свои ответы, пишите отзывы и комментарии. Надеюсь, статья будет кому-то полезной.
Вместо count можно использовать sizeof.
В доках пишут что это одно и тоже самое, но на практике вроде как sizeof работает быстрее 🙂
В официальной доке, написано что sizeof просто псевдоним count. Выходит, это одно и тоже.
Да, я знаю что в доках написано. Но sizeof быстрее, немного, но быстрее.
Можно провести тесты 🙂
Хм, учту, спасибо!