Array_walk или array_map?

В настоящее время я использую array_map для применения обратных вызовов к элементам массива. Но я хочу иметь возможность передать аргумент функции обратного вызова, например, array_walk. Я полагаю, что я мог бы просто использовать array_walk, но мне нужно, чтобы возвращаемое значение представляло собой массив, например, если вы используете array_map, а не TRUE или FALSE.

Так можно ли использовать array_map и передать аргумент функции обратного вызова? Или, возможно, вернуть array_walk массив вместо boolean?

Ответ 1

Вам не нужно возвращать массив.

Вместо:

$newArray = array_function_you_are_looking_for($oldArray, $funcName);

Это:

$newArray = $oldArray;
array_walk($newArray, $funcName);

Ответ 2

Если вы хотите, чтобы возвращаемое значение было массивом, просто используйте array_map. Чтобы добавить дополнительные параметры в array_map, используйте "use", например:

array_map(function($v) use ($tmp) { return $v * $tmp; }, $array);

или

array_map(function($v) use ($a, $b) { return $a * $b; }, $array);

Ответ 3

В зависимости от того, какие аргументы вам нужно передать, вы можете создать завернутую функцию:

$arr = array(2, 4, 6, 8);
function mapper($val, $constant) {
    return $val * $constant;
}

$constant = 3;
function wrapper($val) {
    return mapper($val, $GLOBALS['constant']);
}

$arr = array_map('wrapper', $arr);

На самом деле это кажется слишком простым, чтобы быть правдой. Я подозреваю, что нам понадобится больше контекста, чтобы действительно помочь.

Ответ 4

Чтобы развернуть бит в Hieu отличный ответ, вы также можете использовать пары $key = > $исходного массива. Вот пример с некоторым кодом, заимствованным из раздела комментариев http://php.net/manual/en/function.array-map.php

Следующее будет использовать " use" и включить дополнительный параметр, который представляет собой новый массив.

Ниже код хватит " b_value" и " d_value" и помещается в новый массив $new_arr  (бесполезный пример, чтобы показать точку)

// original array
$arr = ("a" => "b_value",
"c" => "d_value"); 

// new array
$new_arr = array();

array_map(function($k,$v) use (&$new_arr) { $new_arr[] = $v;}, array_keys($arr), $arr);

^ $k - ключ, а $v - значение

print_r из $new_arr

Array
(
    [0] => b_value
    [1] => d_value
)