array_walk или array_map? - PullRequest
10 голосов
/ 10 мая 2011

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

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

Ответы [ 4 ]

6 голосов
/ 10 мая 2011

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

Вместо:

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

Это:

$newArray = $oldArray;
array_walk($newArray, $funcName);
6 голосов
/ 04 октября 2013

Если вы хотите, чтобы возвращаемое значение было массивом, просто используйте 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);
2 голосов
/ 10 мая 2011

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

$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);

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

0 голосов
/ 27 марта 2017

Чтобы немного расширить великолепный ответ Хиеу, вы также можете использовать пары $ key => $ value исходного массива. Вот пример с кодом, заимствованным из секции комментариев 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
)
...