abs массива

#php #arrays

#php #массивы

Вопрос:

Какой самый простой способ получить abs массива в php? Это должен быть лучший способ. Это работает, но в многомерном массиве у него есть некоторые ограничения

 function make_abs($numbers) {
 $abs_array = array();

 foreach($numbers as $key=>$value)
   $abs_array[$key] = abs($value);

 return $abs_array;
}
  

Комментарии:

1. вы могли бы использовать array_walk , но этот код не такой сложный.

2. я думал использовать что-то в качестве ссылки amp;, но я не знаю, как это использовать

3. Ссылочный подход был бы простым: foreach($numbers as amp;$value) $value = abs($value); Однако array_walk больше подходит для ваших целей.

Ответ №1:

Используйте функцию отображения:

 array_map("abs", $numbers)
  

http://php.net/manual/en/function .array-map.php

Ответ №2:

Ваш вариант с использованием ссылок (это не решает вашу проблему рекурсии, просто к вашему сведению):

 function make_abs(amp;$numbers)
{
    foreach($numbers as amp;$value)
        $value = abs($value)
    ;
}
  

Для решения проблемы рекурсии вам нужно перейти в каждый массив:

 function make_abs(amp;$numbers)
{
    foreach($numbers as amp;$value)
        is_array($value) ? make_abs($value) : $value = abs($value)
    ;
}
  

У самого PHP есть несколько удобная функция для этого, array_walk_recursive Docs . Проблема с этой функцией заключается в том, что она ожидает, что обратный вызов будет иметь два параметра: значение (по ссылке) и ключ. Многие функции PHP не соответствуют этим требованиям. Вы можете обойти это, создав себе вспомогательную функцию для использования любой функции, которая принимает только один параметр и возвращает измененное значение. Вы передаете функцию, как в array_map документах:

 function array_walk_recursive_map(array amp;$array, $callback)
{
    $byRef = function(amp;$item, $key) use ($callback)
    {
        $item = $callback($item);
    };
    array_walk_recursive($array, $byRef);
}

# Usage:
array_walk_recursive_map($numbers, 'abs');
  

Надеюсь, это полезно.

Ответ №3:

Вы могли бы сделать array_walk_recursive($numbers, 'make_abs');

http://php.net/manual/en/function .array-walk-recursive.php

Редактировать

 $numbers = array(1, 35, 107);

function make_abs(amp;$item,$key) { // use with reference
    $item = abs($item);
}

array_walk_recursive($numbers, 'make_abs');
  

Этот пример работает с многомерными массивами.