Чат 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].
Читайте также
Комментарии (31)


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. Ок
Популярное за сутки
Сейчас читают
Логические задачи с собеседований