array_walk или array_map?

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

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


person Kemal Fadillah    schedule 10.05.2011    source источник
comment
stackoverflow .com / questions / 3432257 /.   -  person Jürgen Paul    schedule 13.04.2012


Ответы (4)


Он не нужен для возврата массива.

Вместо:

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

It's:

$newArray = $oldArray;
array_walk($newArray, $funcName);
person Lightness Races in Orbit    schedule 10.05.2011
comment
Но если я использую array_walk, возвращаемое значение будет ИСТИНА или ЛОЖЬ. Я хочу, чтобы возвращаемое значение было массивом, как это делает array_map. Так что либо найдите способ передать аргумент с помощью array_map, либо найдите способ, чтобы array_walk возвращал массив вместо логического. - person Kemal Fadillah; 10.05.2011
comment
array_walk редактирует ли исходный массив, для которого он вызывается? Потому что, если это так, это довольно мило. - person sdleihssirhc; 10.05.2011
comment
это потому, что array_walk УСТАНАВЛИВАЕТ массив. Попробуйте print_r ($ newArray); после. Обратите внимание, что Tomalak НЕ выполняет $arr = array_walk($newArray, $funcName); ИСТИНА просто означает «сработало», и вы можете использовать вставленный массив. - person Joshua - Pendo; 10.05.2011
comment
@sdleihssirhc Да, array_walk изменяет исходный массив. Вот почему мне нужно, чтобы он возвращал массив вместо логического. - person Kemal Fadillah; 10.05.2011
comment
@PENDO Разве это не зависит от поставляемой функции? Я напортачил с array_walk, и он изменил исходный массив только в том случае, если определенная мною функция walker использовала символ &: function walker(&$val) { ... } - person sdleihssirhc; 10.05.2011
comment
приведенный выше пример делает то, что вы хотите .... (1) сначала скопируйте исходный $newArray = $originalArray; .. (2) Измените копировальный аппарат array_walk($newArray, 'function'); .. (3) используйте новый массив print_r($newArray); .. возможно, нам не хватает какой-то информации, но это то, что вам нужно? - person Joshua - Pendo; 10.05.2011
comment
@Kemal: Я просто повторяю здесь свой ответ, но ... вам не нужно возвращать массив. Он не возвращает массив, поэтому вам нужно что-то эквивалентное. Вот что делает мой код. Изучите его подробно, и вы увидите, что он решает вашу проблему. Как вы думаете, array_walk вообще существовал бы, если бы он только возвращал TRUE или FALSE и не имел никакого другого эффекта? - person Lightness Races in Orbit; 10.05.2011
comment
@Kemal: array_walk изменяет переданный ему массив, но в моем примере это НЕ ваш исходный массив. Это копия. Это то же самое, как если бы функция вернула вам новый измененный массив. - person Lightness Races in Orbit; 10.05.2011

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

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

or

array_map(function($v) use ($a, $b) { return $a * $b; }, $array);
person Hieu Vo    schedule 04.10.2013

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

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

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

person sdleihssirhc    schedule 10.05.2011

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

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

Код ниже захватит "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
)
person Robert Sinclair    schedule 27.03.2017