Функция map_deep()
в WordPress позволяет применить заданную функцию ко всем элементам массива, объекта или скалярам (числам и строкам), проходя по каждому уровню вложенности. Она является расширением функции array_walk_recursive()
и поддерживает не только массивы, но и объекты.
map_deep( mixed $value, callable $callback ): mixed
Функция map_deep()
принимает два обязательных параметра:
$value
— данные, которые будут обработаны (массив, объект, строка или число).$callback
— функция, которая будет применена ко всем не-массивным и не-объектным элементам$value
.
Возвращаемое значение
Функция возвращает массив, объект или скаляр с применённой функцией ко всем его элементам.
1. Применение функции к каждому элементу массива
В этом примере создадим функцию sanitize_text_field
, которая удаляет HTML-теги из текста. Затем применим её ко всем элементам массива:
$values = array( 'apple', '<b>banana</b>', '<p>pear</p>' );
$sanitized_values = map_deep( $values, 'sanitize_text_field' );
print_r($sanitized_values);
// Результат:
// array(
// "apple",
// "banana",
// "pear"
// )
2. Очистка многомерного массива
Функция работает также и с многомерными массивами. Здесь функция strip_tags
удаляет HTML-теги из текста:
$nested_values = array(
'option_1' => '<div>text one</div>',
'option_2' => array(
'sub_option_1' => '<span>text two</span>',
'sub_option_2' => '<p>text three</p>',
),
);
$clean_values = map_deep( $nested_values, 'strip_tags' );
print_r($clean_values);
// Результат:
// array(
// "option_1" => "text one",
// "option_2" => array(
// "sub_option_1" => "text two",
// "sub_option_2" => "text three"
// )
// )
3. Применение пользовательской функции к каждому элементу массива
Создадим функцию format_numbers
, которая приводит все строки с числами к целым числам, а затем применим её ко всем элементам массива:
function format_numbers( $value ) {
return is_numeric( $value ) ? intval( $value ) : $value;
}
$values = array( '10', 'text', '20', '30 apples' );
$formatted_values = map_deep( $values, 'format_numbers' );
print_r($formatted_values);
// Результат:
// array(
// 10,
// "text",
// 20,
// "30 apples"
// )
4. Обработка объекта с помощью функции
Функция map_deep()
также работает с объектами. В этом примере создадим объект с вложенными значениями и применим к нему strtoupper
для перевода текста в верхний регистр:
$data = (object) array(
'name' => 'apple',
'details' => (object) array(
'color' => 'red',
'flavor' => 'sweet',
),
);
$uppercased_data = map_deep( $data, 'strtoupper' );
print_r($uppercased_data);
// Результат:
// stdClass Object
// (
// [name] => APPLE
// [details] => stdClass Object
// (
// [color] => RED
// [flavor] => SWEET
// )
// )
5. Применение функции к отдельным строкам и числам
Если map_deep()
используется с одиночными строками или числами, она просто возвращает результат применения указанной функции:
$text = 'apple pie';
echo map_deep( $text, 'strtoupper' );
// Вывод: APPLE PIE
$number = '10';
echo map_deep( $number, 'intval' );
// Вывод: 10
Заключение
Функция map_deep()
— мощный инструмент для рекурсивного применения функций к элементам массивов и объектов. Она упрощает обработку вложенных структур данных, позволяет избежать написания сложных циклов и улучшает читаемость кода.