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

Последнее обновление: 1.11.2015

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

Galaxy ACE II"; $phones = "Sony Xperia Z3"; $phones = "Samsung Galaxy III"; for($i=0;$i"; ?>

Здесь создается массив $phones из четыре элементов. Каждый элемент в массиве представляет собой пару ключ - значение . Так, первый элемент $phones = "Nokia N9" имеет ключ - число 0, а значение - строку "Nokia N9". В таких массивах числовые ключи еще называются индексами.

С помощью функции count() можно узнать количество элементов в массиве. А благодаря тому, что ключи идут по порядку от 0 до 3, и зная размер массива, можно вывести элементы массивы в цикле for .

Чтобы было более понятно отношения ключей и значений элементов, выведем массив с помощью функции print_r :

Print_r($phones);

У нас получится следующий вывод:

Array ( => Nokia N9 => Samsung Galaxy ACE II => Sony Xperia Z3 => Samsung Galaxy III)

Данное создание массива будет также эквивалентно следующему:

"; ?>

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

Зная ключ элемента в массиве, мы можем обратиться к этому элементу, получить или изменить его значение:

// получим элемент по ключу 1 $myPhone = $phones; echo "$myPhone
"; // присвоение нового значения $phones = "Samsung X650"; echo "$phones
";

Но в качестве ключей могут использоваться не только целые числа, но и строки:

Подобные массивы еще называют ассоциативными.

Оператор array

Выше был рассмотрен один способ создания массива. Но есть и другой, который предусматривает применение оператора array() .

Оператор array() принимает набор элементов. Здесь также явным образом не указаны ключи. Поэтому PHP автоматически нумерует элементы с нуля. Но мы также можем указать для каждого элемента ключ:

"iPhone5", "samsumg"=>"Samsung Galaxy III", "nokia" => "Nokia N9", "sony" => "Sony XPeria Z3"); echo $phones["samsumg"]; ?>

Операция => позволяет сопоставить ключ с определенным значением.

Перебор ассоциативных массивов

Выше мы посмотрели, как с помощью цикла for вывести все элементы массива, где ключи заданы последовательно числами от 0 до 3. Однако с ассоциативными массивами это не работает. И для них в PHP предназначен специальный тип цикла - foreach...as :

"iPhone5", "samsumg"=>"Samsung Galaxy III", "nokia" => "Nokia N9", "sony" => "Sony XPeria Z3"); foreach($phones as $item) echo "$item
"; ?>

В цикле foreach из массива последовательно извлекаются все элементы и их значение помещается в переменную, указанную после ключевого слова as . В данном случае в переменную $item по очереди помещаются все четыре значения из массива $phones. Когда будет извлечен последний элемент из массива, цикл завершается.

Цикл foreach позволяет извлекать не только значения, но и ключи элементов:

"iPhone5", "samsumg"=>"Samsung Galaxy III", "nokia" => "Nokia N9", "sony" => "Sony XPeria Z3"); foreach($phones as $key=>$value) echo "$key => $value
"; ?>

Здесь при переборе элементов цикла в переменную $key будет передаваться ключ элемента, а в переменную $value ее значение.

Альтернативу циклу foreach представляет использование функций list и each :

"iPhone5", "samsumg"=>"Samsung Galaxy III", "nokia" => "Nokia N9", "sony" => "Sony XPeria Z3"); while (list($key, $value) = each($phones)) echo "$key => $value
"; ?>

Цикл while будет работать, пока функция each не вернет значение false . Функция each проходит по всем элементам массива $phones и получает его в виде массива, в который входят ключ и значение элемента. Затем этот массив передается функции list и проиcходит присваивает значения массива переменным внутри скобок. Когда функция each закончит перебор элементов массива $phones, она возвратит false , и действие цикла while будет завершено.

Многомерные массивы

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

array("iPhone5", "iPhone5s", "iPhone6") , "samsumg"=>array("Samsung Galaxy III", "Samsung Galaxy ACE II"), "nokia" => array("Nokia N9", "Nokia Lumia 930"), "sony" => array("Sony XPeria Z3", "Xperia Z3 Dual", "Xperia T2 Ultra")); foreach ($phones as $brand => $items) { echo "

$brand

"; echo "
    "; foreach ($items as $key => $value) { echo "
  • $value
  • "; } echo "
"; } ?>

И при выводе мы получим 4 списка:

Чтобы обратиться к элементу данного, также надо указать ключи в квадратных скобках. Например, обратимся к первому элементу в первом массиве. Так как ключ первого массива - "apple", а ключ первого элемента в первом массиве - число 0 (так как мы явным образом не указали ключи):

Echo $phones["apple"];

Подобным образом можно получить второй элемент третьего массива:

Echo $phones["nokia"];

Допустим, вложенные массивы также представляют ассоциативные массивы:

array("apple" => "iPhone5", "samsumg" => "Samsung Galaxy III", "nokia" => "Nokia N9"), "tablets" => array("lenovo" => "Lenovo IdeaTab A3500", "samsung" => "Samsung Galaxy Tab 4", "apple" => "Apple iPad Air")); foreach ($technics as $tovar => $items) { echo "

$tovar

"; echo "
    "; foreach ($items as $key => $value) { echo "
  • $key: $value
  • "; } echo "
"; } // присвоим одному из элементов другое значение $technics["phones"]["nokia"] = "Nokia Lumnia 930"; // выведем это значение echo $technics["phones"]["nokia"]; ?>

Допустим у вас есть представление о массиве PHP . Работать с массивами без встроенных функций трудно. Можно описать функцию для определённой задачи. Вы можете потратить несколько часов на написание своих функций. Это плохой путь. Я предлагаю вам прочитать мануал на сайте php.net. Я написал несколько функций и через некоторое время обнаружил аналоги на php.net. Например поиск элемента в массиве легко сделает функция array_search()

//array_search() $array = array("name" => "Egor", "site" => "training.web", "description" => "обучение php"); $key = array_search("training.web", $array); echo $key; // site

Функция in_array() возвращает TRUE если элемент найден в массиве . Массив можно хаотично перемешать при помощи функции shuffle(). Если вам нужно вывести цитаты на сайте, то применяйте эту функцию. Часто применяется реверс массива. Функция array_reverse() поможет вам сделать реверс элементов в массиве.

//in_array() $lang = array("PHP", "RUBY", "HTML", "CSS"); if (in_array("PHP", $lang)) { echo "Нашел PHP"; } //shuffle() $numbers = range(1, 10); var_dump($numbers); //array(10) shuffle($numbers); print_r($numbers); //Array ( => 8 => 4 => 9 => 6 => 5 // => 7 => 1 => 2 => 10 => 3) $numbers = range(1, 10); //array_reverse() $numbers = array_reverse($numbers); print_r($numbers); //Array ( => 10 => 9 => 8 => 7 => 6 // => 5 => 4 => 3 => 2 => 1)

Самая часто используемая функция - это count(). Она подсчитывает количество элементов массива. Функция sizeof() считается устаревшей. Иногда нужно подсчитать количество одинаковых элементов в массиве. Поможет функция array_count_values(). Вы можете наполнить массив множеством элементов, а потом применить эту функцию. Если описать функцию, то вы потратите массу времени. Очень часто применяют отладочную функцию print_r(). Он выводит весь массив, каким бы большим и сложным он не был. Для того чтобы вытащить последний элемент массива, примените такой код: $numbers[ count($numbers) - 1 ]. Вы также можете применить функцию end().

//count() $numbers = range(1, 10); $count = count($numbers); for($i=0; $i 3 => 2 => 1)

Очень часто применяют функцию implode(). Она объединяет элементы массива в строку . Если вы используете свой разделитель, то вы можете разбить массив и собрать элементы в строку. Между элементами массива можно поставить правый слеш "/". Вы можете добавить в конец url-адреса такую строку. Если у вас есть строка, похожая на url-адрес, то для разбивки строки используйте функцию explode() . Читайте о функции explode в статье как разбить строку в массив explode() PHP . По разделителю строковые элементы строки превращаются в элементы массива. Одним словом, строковый тип дынных превращается в массив.

Ru/egor/lesons //explode() $url = "trainingweb.ru/egor/lesons"; $arr = explode("/", $url); print_r($arr); //Array ( => trainingweb.ru => egor => lesons)

Мне очень нравится функция array_map(). Она применяет callback-функцию ко всем элементам массива. Вы пишите функцию, а потом применяете её в функции array_map(). Вы можете прибавить единицу к каждому элементу массива. Вы можете перебирать массив таким образом или очищать массив от ненужных элементов.

//array_map() $numbers = range(1, 10); function plusOne($num) { $num += 1; return $num; } $arr = array_map("plusOne", $numbers); print_r($arr); //Array ( => 2 => 3 => 4 => 5 => 6 // => 7 => 8 => 9 => 10 => 11)

Бывает так, что нужно привести строку к массиву. Это делается просто при помощи функции (array). Я сделаю 2 строковые переменные. Затем переменные превращу в массивы и объединю массивы в один массив. Для объединения массивов в один общий массив подойдёт функция array_merge(). Вы можете массу массивов объединить в один массив: array_merge($arr1, $arr2, $arr3, ...,).

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

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

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

$ 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

$ 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); //Ничего не выведет

echo in_array ("Abc" , $ myArr ) ; //Выведет 1

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

echo in_array ("2" , $ myArr ) ; //Выведет 1

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

$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); //Ничего не выведет

$ 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);

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

$ valuesArr = array_values ($ myArr ) ;

$ keysArr = array_keys ($ myArr ) ;

print_r ($ valuesArr ) ;

print_r ($ keysArr ) ;

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

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

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


"; sort($myArr); print_r($myArr); echo "
"; sort($myArr, SORT_STRING); print_r($myArr); echo "
";

print_r ($ myArr ) ;

echo "
" ;

sort ($ myArr ) ;

print_r ($ myArr ) ;

echo "
" ;

sort ($ myArr , SORT_STRING ) ;

print_r ($ myArr ) ;

echo "
" ;

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

Array ( => 10 => 1 => 12 => 13 => 2 => 3 => 11 => 100)
Array ( => 1 => 2 => 3 => 10 => 11 => 12 => 13 => 100)
Array ( => 1 => 10 => 100 => 11 => 12 => 13 => 2 => 3)

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

$myArr = array(10, 1, 12, 13, 2, 3, 11, 100); print_r($myArr); echo "
"; asort($myArr); print_r($myArr); echo "
"; arsort($myArr); print_r($myArr); echo "
";

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

print_r ($ myArr ) ;

echo "
" ;

asort ($ myArr ) ;

print_r ($ myArr ) ;

echo "
" ;

arsort ($ myArr ) ;

print_r ($ myArr ) ;

echo "
" ;

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

Array ( => 10 => 1 => 12 => 13 => 2 => 3 => 11 => 100)
Array ( => 1 => 2 => 3 => 10 => 11 => 12 => 13 => 100)
Array ( => 100 => 13 => 12 => 11 => 10 => 3 => 2 => 1)

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

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

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

$ 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 < $b) return -1; elseif ($a > $b) return 1; return 0; } //Сортируем массив usort($myArr, "compare"); //Выводим на экран print_r($myArr);

//Наш массив

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

//Функция сравнения элементов

function compare ($ a , $ b ) {

if ($ a [ 1 ] & lt ; $ b [ 1 ] )

return - 1 ;

elseif ($ a [ 1 ] & gt ; $ b [ 1 ] )

return 1 ;

return 0 ;

//Сортируем массив

usort ($ myArr , "compare" ) ;

//Выводим на экран

print_r ($ myArr ) ;

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

Array ( => Array ( => 1 => String1) => Array ( => 2 => String2) => Array ( => 3 => 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."
"; } array_walk($myArr, "walker_function", "is");

$ myArr = array ("A" =& gt ; "Ivan" , "B" =& gt ; "John" , "C" =& gt ; "Bob" ) ;

function walker_function ($ value , $ key , $ additional ) {

echo $ key . " " . $ additional . " " . $ value . "
" ;

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

Что такое массив?
Если не задротничать и объяснять понятным языком, то массив - это переменная, содержащая в себе сколько угодно других переменных, а те в свою очередь, тоже могут быть массивами. Таким образом, массив может быть просто гиганских объемов и вмещать в себя очень много информации. А благодаря функциям PHP для работы с массивами, с ними становится очень удобно работать. Сортировать, чистить, находить нужные ключи, перебирать и еще очень много чего.

Некоторые примеры
Рассмотрим пример:

$b = "test b" ; ?>

Тут мы создали две переменные

1
2
3

$test_array [ "a" ] = "test a" ;
$test_array [ "b" ] = "test b" ; ?>

А тут мы создали массив $test_array и создали 2 ключа с некоторыми значениями.
Первоначально может показаться что с массивом все выглядит както громоздко, но давайте представим ситуацию когда нам надо вывести на экран 1000 переменных. Если все это отдельные переменные, то мы можем просто исписать целую простыню пока напишем что-то вроде

1
2
3
4
5

echo $b ;
echo $c ;
echo $d ;
... ?>

А вот если бы все этти переменные были ключами массива, то мы просто написали:

1
2
3

echo $value ;
} ?>

Конструкция foreach проходит по каждому ключу массива по очереди, а $value содержит значение текущего ключа массива. Правда удобно? А это лишь самый примитивный пример.

Сортировка данных
Один из самых лучших способов применить массив - это применить его для сортировки данных или для объединения каких то данных, что бы потом не путаться. Рассмотрим пример с машинами. Допустим у нас есть 2 машины и на каждую из них по два варианта салона. И у каждого по 3 возможных цвета.

1
2
3
4
5
6
7
8
9
10
11
12
13

"Машина1" => array(
"салон1" => array(
"цвет1" => "черный" ,
"цвет2" => "красный" ,
"цвет3" => "зеленый"
),
"салон2"
),
"Машина2" => array(
//и так далее
); ?>

Таким образом мы получаем массив, содержащий 2 ключа, машина1 и машина2. В каждом из них по два салона, а в каждом салоне по 3 цвета. И ко всему этому очень легко добраться. Например:

//выведет "черный" ?>

Поиск
Как и в любых данных, в массивах важен поиск и тут в PHP предусмотрен ряд функций для поиска по массивам. Например функция array_key_exists() проверяет есть ли в массиве определенный ключ, а функция in_array() проверяет есть ли в массиве определенное значение. Для тех кто еще не понял, все данные в массивах хранятся в виде ключ=значение



Статьи по теме