Чат PHP-разработчиков
Функции для работы с массивами в PHP

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

Мы с вами изучили основы работы с массивами, у вас теперь есть понимание того, что такое массив, что такое цикл, и мы даже реализовали несколько своих функций для работы с массивами. Теперь вы готовы получить знания об уже готовых функциях для работы с массивами в PHP.

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

Проверка существования ключа в массиве

Зачастую мы не знаем, есть ли в массиве какой-либо ключ. И если мы попробуем обратиться по ключу, которого в массиве нет – возникнет ошибка. Простейший пример.

Код доступен только после покупки курса PHP для начинающих.

В результате, как и ожидали – ошибка.

Ошибка при обращении к несуществующему элементу массива

Чтобы подобной ситуации избежать, следует проверять, есть ли такой ключ в массиве или нет. Для этого есть функция array_key_exists($key, $array). Она принимает на вход первым аргументом ключ, а вторым – массив, в котором его наличие нужно проверить. Возвращает true, если ключ найден, и false – если нет. Использование выглядит следующим образом.

Код доступен только после покупки курса PHP для начинающих.

Результат:
Ошибки не возникло

Проверка существования значения

Не менее часто приходится узнать, а есть ли значение в массиве. Например, мы хотим узнать, есть ли число 7 в массиве. Как мы помним, в прошлом уроке мы самостоятельно написали для этого функцию. Однако в реальном кодинге нужно по большей части пользоваться готовым. Эта функция называется in_array($needle, $array). Здесь $needle – это то, что ищется, $array – массив, в котором ищем. Она возвращает true, если значение найдено, и false – если нет. Выглядит её применение следующим образом.

Код доступен только после покупки курса PHP для начинающих.

Объединение массивов

Очень часто требуется объединить 2 массива в один. Для этого есть функция array_merge($array1, $array2). В качестве аргументов, как вы поняли, этой функции передаются массивы, которые нужно объединить. Возвращает эта функция получившийся массив.

Код доступен только после покупки курса PHP для начинающих.

Результат:
Объединение двух массивов

Обратите внимание, что если ключи будут строковыми, то поведение функции будет несколько иным. Если строковые ключи из $array2 будут пересекаться с ключами из массива $array1, то в результат для пересекающихся ключей попадут только значения из $array2. Они как бы перезапишут то, что было в первом массиве.

Код доступен только после покупки курса PHP для начинающих.

Результат получится следующим:
Объединение массивов со строковыми ключами

Это может быть удобно, когда нам необходимо обновить часть каких-то данных в массиве. Как в примере выше – мы обновили пароль, оставив логин прежним.

Другие функции

Функций для работы с массивами в PHP очень много. И остальные вы найдёте на сайте с документацией PHP.
А домашнее задание вам в этом поможет.

Если этот урок был вам полезен, расскажите об этом курсе своим знакомым или поделитесь на него ссылкой в социальных сетях.

Домашнее задание
  1. Есть массив чисел – [1, 3, 2]. Отсортируйте их от меньшего к большему и преобразуйте в строку, в которой значения элементов массива разделяются двоеточиями. В результате должна получиться строка “1:2:3”.
  2. Есть массив чисел – [1, 2, 3, 4, 5]. Получите с помощью одной функции массив, в котором будут элементы исходного с 1-го элемента по 3-й. В результате должен получиться массив с числами [2, 3, 4].
  3. Есть массив чисел – [1, 2, 5, 2, 3, 1, 6]. Получите такой массив, в котором каждое значение из исходного будет содержаться только один раз. В результате должен получиться массив, содержащий числа [1, 2, 5, 3, 6].
Онлайн обучение PHP
Путь с полного нуля до джуниора!
Начать бесплатно
Читайте также
Курс программирования на PHP
Подготовка до уровня устройства на работу!
Начать бесплатно
Комментарии (46)


Dasgonder
first:
$array = [1, 3, 2];
sort($array);
$string = implode(":", $array);
echo $string;
second:
$array = [1, 2, 3, 4, 5];
$slice = array_slice($array, 1, 3);
var_dump($slice);
third:
$array = [1, 2, 5, 2, 3, 1, 6];
$unique = array_unique($array);
var_dump($unique);
ivashkevich

Отлично! Я бы решал точно так же :)

humanidis@gmail.com

Есть одно, очень элегантное решение последней задачи с помощью функции array_flip. Оно в два раза быстрее функции array_unique.

$array = [1, 2, 5, 2, 3, 1, 6];
$flipFlip = array_keys(array_flip($array));
var_dump($flipFlip);
ivashkevich

Я Вам скажу по секрету, вот так - ещё быстрее.

array_flip(array_flip($array))

При этом ещё и ключи сохранятся.

Однако, такие хаки работают только если в качестве значений в массиве будут лежать string или integer. С тем же float уже не получится:

$x = [1, 2.5];
array_flip($x);

Будет ошибка:

Warning: array_flip(): Can only flip STRING and INTEGER values!

В плане скорости - выигрыш. А под элегантностью в программировании мне привычнее понимать очевидность кода, чем его скорость работы.

Ставлю плюсик за то, что копнули поглубже :)

Andreo
// 1 задание
$arr = [1, 3, 2];
sort($arr);
$nextArr = implode(':',$arr);
echo $nextArr;

// 2 задание
$arr = [1, 2, 3, 4, 5];
$nextArr = range(2,4);
var_dump($nextArr);

// 3 задание
$arr = [1, 2, 5, 2, 3, 1, 6];
$nextArr = array_unique($arr);
var_dump($nextArr);
ivashkevich

Второе задание - некорректно. range возвращает просто массив с числами, никак не связанных с исходным массивом, вот тут правильно - https://webshake.ru/php-training-course/18#comment485

Остальные задания верны.

1nSide

1

$arr = [1,3,2];
// функция sort() сортерует массив от меньшего к большему.
sort($arr);
// с помощью фуекции implode() приобразуем массив в строку.
$format = implode(':',$arr);
echo $format;
1nSide

2

// заполняем массив
$arr = [1,2,3,4,5];
// с помощью функции array_splice удаляем первый и последний элемент в массиве
$output = array_splice($arr, 1 , -1);
// c помощью цикла foreach выводим оставшиеся элементы массива в браузер
foreach ($output as $value){
    echo $value . ' ';
}
1nSide

3

// исходный массив
$arr = [1, 2, 5, 2, 3, 1, 6];
// array_unique функция которая удаляет повторяющиеся элементы в массиве
$output = array_unique($arr);
// выводим текущий массив в браузер
foreach ($output as $value){
    echo $value . ' ';
}
ivashkevich

И снова отлично! =)

andropij
1-ая задача
<?php
$array = [1, 3, 2];

asort($array);
$array = implode(";", $array);
var_dump($array);

2-ая задача
здесь я сделал два варианта. 
1-ый вариант
<?php
$array = [1, 2, 3, 4, 5];
$array2 = [];
foreach (range(2, 4) as $item) {
    array_push($array2, $item);
}
var_dump($array2);

2-ой вариант
<?php
$array = [1, 2, 3, 4, 5];
$array = array_slice($array, 1,3);
var_dump($array);

3-ая задача

<?php
$array = [1, 2, 5, 2, 3, 1, 6];
$array = array_unique($array);
var_dump($array);
ivashkevich

Во втором задании верным будет второй вариант, так как работа идёт с исходным массивом. А так - всё правильно =) В первом задании можно было использовать просто sort(), но не принципиально.

Fox-24

Хороший урок!)


// Есть массив чисел – [1, 3, 2].
// Отсортируйте их от меньшего к большему и преобразуйте в строку, в которой значения элементов массива разделяются двоеточиями.
// В результате должна получиться строка “1:2:3”.

$numbers = [
    1,
    3,
    2
];

sort($numbers);
$comma_separated = implode(":", $numbers);

echo $comma_separated;

// Есть массив чисел – [1, 2, 3, 4, 5].
// Получите с помощью одной функции массив, в котором будут элементы исходного с 1-го элемента по 3-й.
// В результате должен получиться массив с числами [2, 3, 4].

$numbers = [
    1,
    2,
    3,
    4,
    5
];

$output = array_slice($numbers, 1, 3);
echo var_dump($output);

// Есть массив чисел – [1, 2, 5, 2, 3, 1, 6].
// Получите такой массив, в котором каждое значение из исходного будет содержаться только один раз.
// В результате должен получиться массив, содержащий числа [1, 2, 5, 3, 6].

$numbers = [
    1,
    2,
    5,
    2,
    3,
    1,
    6
];

$result = array_unique($numbers);
echo var_dump($result);
ArtemijeKA

3

$arr = [1, 2, 5, 2, 3, 1, 6];
var_dump(array_unique($arr));

2

$arr = [1, 2, 3, 4, 5];
var_dump(array_slice($arr, 1, 3, true)); // true сохранили исходные индексы

1

$arr = [1, 3, 2];
sort($arr);
echo implode(':', $arr);
ivashkevich

Хорошо, а почему в обратном порядке?)

SBTesla
<?php
$array = [1, 3, 2, 4, 6, 5, 8, 7, 10, 9];
sort($array);

$numbers =  implode(':', $array);
echo  $numbers;

// Второе задание

$arrayNumbers = [1, 2,  3, 4, 5, 6, 7, 2, 4, 5,12, 3,22, "кек", "lol"];
$i = array_slice ($arrayNumbers, 1, 3);

var_dump($i);

//Третье задание

$result = array_unique($arrayNumbers, SORT_NUMERIC);
var_dump($result);

Только я не совсем понял почему флаг SORT_NUMERIC указывает последний ключ в массиве со словом, он же должен сравнивать элементы как числа, и если в массиве допустим много числовых значений и строковых как выбрать только числовые например?

ivashkevich

Хорошо. А отфильтровать можно с помощью array_filter()

Benya
<?php

$array = [1, 3, 2];

$sorts = asort($array);
$arraySort = implode(":", $array);

echo $arraySort;
//2 задача
$array = [1, 2, 3, 4, 5];

$arrayOutput = array_slice($array, 1, 4);

for ($i = 1; $i < count($arrayOutput); $i++) {
    echo $arrayOutput[$i];
}

//3 задача
$array = [1, 2, 5, 2, 3, 1, 6];

$arrayUnique = array_unique($array);

var_dump($arrayUnique);
lordbear53@gmail.com

Первое:

$arr = [1,3,2];
sort($arr);
$sorted = implode(':', $arr);
echo $sorted;

Второе:

$arr = [1,2,3,4,5];
$slicedArr = array_slice($arr,1,3);
var_dump($slicedArr);

Третье:

$arr = [1,2,5,2,3,1,6];
$uniArr = array_unique($arr);
var_dump($uniArr);
demyanovpaul@yandex.ru

Есть массив чисел – [1, 3, 2]. Отсортируйте их от меньшего к большему и преобразуйте в строку, в которой значения элементов массива разделяются двоеточиями. В результате должна получиться строка “1:2:3”.

$array = [1, 3, 2];

asort($array);
echo implode(':', $array);

Есть массив чисел – [1, 2, 3, 4, 5]. Получите с помощью одной функции массив, в котором будут элементы исходного с 1-го элемента по 3-й. В результате должен получиться массив с числами [2, 3, 4].

$array = [1, 2, 3, 4, 5];

var_dump(array_slice($array, 1, 3));

Есть массив чисел – [1, 2, 5, 2, 3, 1, 6]. Получите такой массив, в котором каждое значение из исходного будет содержаться только один раз. В результате должен получиться массив, содержащий числа [1, 2, 5, 3, 6].

$array = [1, 2, 5, 2, 3, 1, 6];

var_dump(array_unique($array));
virtual2018
<?php
function arrayToString(array $array, string $ch)
{
    return implode($ch, $array);
}

$arrayIn = [1, 3, 2];
echo "<p>Исходный массив задание 1:</p>";
echo '[' . arrayToString($arrayIn, ',') . ']';
echo "<p>Модифицированный массив по заданию 1:</p>";
asort($arrayIn);
echo '[' . arrayToString($arrayIn, ':') . ']';

$arrayIn = [1, 2, 3, 4, 5];
echo "<p>Исходный массив задание 2:</p>";
echo '[' . arrayToString($arrayIn, ',') . ']';
echo "<p>Модифицированный массив по заданию 2:</p>";
echo '[' . arrayToString(array_slice($arrayIn, 1, 3), ',') . ']';

$arrayIn = [1, 2, 5, 2, 3, 1, 6];
echo "<p>Исходный массив задание 3:</p>";
echo '[' . arrayToString($arrayIn, ',') . ']';
echo "<p>Модифицированный массив по заданию 3:</p>";
echo '[' . arrayToString(array_unique($arrayIn), ',') . ']';

Исходный массив задание 1:

[1,3,2]
Модифицированный массив по заданию 1:

[1:2:3]
Исходный массив задание 2:

[1,2,3,4,5]
Модифицированный массив по заданию 2:

[2,3,4]
Исходный массив задание 3:

[1,2,5,2,3,1,6]
Модифицированный массив по заданию 3:

[1,2,5,3,6]

ivashkevich

В целом всё норм, но непонятно, зачем вместо вызова напрямую implode оборачивать её в arrayToString, которая ничего другого не делает.

Bogdan

//Есть массив чисел – [1, 3, 2]. Отсортируйте их от меньшего к большему и преобразуйте в строку,
//в которой значения элементов массива разделяются двоеточиями. В результате должна получиться строка “1:2:3”.

$array = [1, 3, 2];
$result = (string)'';

sort($array);

foreach ($array as $key => $value) {
    $array[$key] = (string) $array[$key];
    $array[$key] != $array[count($array)-1] ? $result .= $array[$key] .':' : $result .= $array[$key];
}
unset($value);

// Есть массив чисел – [1, 2, 5, 2, 3, 1, 6]. Получите такой массив, в котором каждое значение из исходного будет
// содержаться только один раз. В результате должен получиться массив, содержащий числа [1, 2, 5, 3, 6].

$array = [1, 2, 5, 2, 3, 1, 6];
$array = array_unique($array);

//Есть массив чисел – [1, 2, 3, 4, 5]. Получите с помощью одной функции массив, в котором будут элементы исходного
// с 1-го элемента по 3-й. В результате должен получиться массив с числами [2, 3, 4].

$array = [1, 2, 3, 4, 5];

$out = array_slice($array, 1, 3);
Bogdan

вот это я накакокодил с первым заданием ))) не нашел я implode))))

ivashkevich
  1. Как вы уже сами сказали, можно проще. Сортировку тоже стоило встроенную использовать:

    sort($array);
    echo implode(':', $array);
  2. Ок
  3. Ок
SashkoUkraine
<?php

$arrayNumbers = [1, 3, 2];
sort($arrayNumbers);
$stringFromArray = implode(':', $arrayNumbers);
echo $stringFromArray;

echo "<br>";

$arrayOfNumbersForCut =  [1, 2, 3, 4, 5];
$output1 = array_slice($arrayOfNumbersForCut, 1, 3);
var_dump ($output);

echo "<br>";

$randomNumber = [1, 2, 5, 2, 3, 1, 6];
$output2 = array_unique($randomNumber);
var_dump($output);
red.shuhov48@gmail.com
            $arr =[1, 2, 3];
            sort($arr);
            echo implode(":",$arr);

            $arr2 =[1, 2, 3, 4, 5];
            $delElement = array_diff($arr2,[1,5]);
            var_dump($delElement);

            $arr3 =[1, 2, 5, 2, 3, 1, 6];
            $unique = array_unique($arr3);
            var_dump($unique);
ivashkevich
  1. ОК
  2. array_slice
  3. ОК
red.shuhov48@gmail.com

по array_slice - там же происходит сброс ключа, поэтому и выбрал array_diff
результаты:
array (size=3)
0 => int 2
1 => int 3
2 => int 4
array (size=3)
1 => int 2
2 => int 3
3 => int 4

ivashkevich

Когда берется срез из существующего массива, ключи как правило не нужны.

red.shuhov48@gmail.com

ок,спасибо)

excent63

Добрый вечер!
Домашнее задание:
1:

$arr = [1,3,2];
sort($arr);
$string = implode(' : ',$arr);
echo $string;

2:

$array = [1,2,3,4,5];
$slice = array_slice($array,1,3);
var_dump($slice);

3:

$uni = [1,2,3,2,4,6,4,5,7];
$uni = array_unique($uni);
var_dump($uni);
ivashkevich

Всё отлично!

Pro100Bah
$array = [3, 6, 9, 99, 7, 11];
sort($array);
$arrayInString = implode(';', $array);
var_dump($arrayInString);

$array1 = [1, 2, 3, 4, 5];
$sliceOfArray = array_slice($array1, 1, 3);
var_dump($sliceOfArray);

$array2 = [1, 2, 5, 2, 3, 1, 6];
$zeroRepeats = array_unique($array2);
var_dump($zeroRepeats);

Чисто для себя скинул ДЗ, так как вариантов тут действительно не много, найти в библиотеке PHP, на которую еще и ссылку дали функции для решение задачи, но как говориться лучше сделать, чем не сделать. Спасибо за качественные уроки!!!

ivashkevich

Отлично! Суть этой домашки - показать что в этой доке все просто и понятно)

volodia.pavloff201343@gmail.com
$array = [1,3,2];
asort($array);
$use = implode(":",$array);
var_dump($use);
echo '<br>';

$array_1 = [1,2,3,4,5];
$slice = array_slice($array_1,1,3);
var_dump($slice);
echo '<br>';

$array_2 = [1, 2, 5, 2, 3, 1, 6];
$unique = array_unique($array_2);
var_dump($unique);
Luganskiy

Сделал так, потом увидел "implode"

$ToSortTheNumbers = [1, 3, 2];
sort($ToSortTheNumbers);

echo "$ToSortTheNumbers[0] : $ToSortTheNumbers[1] : $ToSortTheNumbers[2]";

ivashkevich

Такое решение не гибкое - если поменяется число элементов массива, то всё поломается. Если и делать, то через цикл.

Самый понятный курс PHP
Онлайн-уроки в удобное время!
Начать бесплатно
Популярное за сутки
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Сейчас читают
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Новые статьи
Логические задачи с собеседований