Выполнить функцию для каждого элемента массива

1-ый способ

Выполнить функцию для каждого элемента массива можно через функцию array_map().

$array = ['php', 'mysql'];
 
# сделать все элементы массива прописными буквами
function do_upper($arr) {
    return mb_strtoupper($arr, 'UTF-8');
}

$array_upper = array_map('do_upper', $array);

$array_upper; // [PHP, MYSQL]

Если в функцию array_map() будет передан вложенный массив, то PHP вернёт ошибку «Warning:  mb_strtoupper() expects parameter 1 to be string, array given».

2-ой способ: заменить текущие элементы массивы

Функция array_map() возвращает новый массив, не затрагивая исходный массив. Также есть функция array_walk(), которая заменяет элементы в указанном массиве, применяя к ним указанную функцию.

$array = ['php', 'mysql'];
 
# сделать все элементы массива прописными буквами
function do_upper(&$arr) {
    $arr = mb_strtoupper($arr, 'UTF-8');
}
 
array_walk($array, 'do_upper');

$array; // [PHP, MYSQL]

Функция array_walk() также не поддерживет вложенные массивы (выводит ошибку «Warning:  mb_strtoupper() expects parameter 1 to be string, array given»).

Но есть отдельная функция array_walk_recursive(), которая применяет код к каждому элементу массиву, включая элементы вложенных массивов.

$array = ['php', 'mysql', ['zend']];
 
function do_upper(&$arr) {
    $arr = mb_strtoupper($arr, 'UTF-8');
}
 
array_walk_recursive($array, 'do_upper');

print_r($array);

/*
Array (
    [0] => PHP,
    [1] => MYSQL,
    [2] => Array (
        [0] => ZEND
    )
)
*/

2-ой способ

Также можно использовать цикл foreach через символ &.

$array = [2, 4, 6];
foreach ($array as &$arr) {
    $arr *= 2;
}
unset($arr);

// array(4, 8, 12)

На примере выше удаляется переменная $arr, чтобы случайно не изменить последний элемент массива в другом коде.