数组的abs

时间:2011-10-14 16:53:29

标签: php arrays

在php中获取数组的abs的简单方法是什么?它必须是一种更好的方式。这有效,但在多维数组中它有一些限制

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

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

 return $abs_array;
}

3 个答案:

答案 0 :(得分:6)

使用地图功能:

array_map("abs", $numbers)

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

答案 1 :(得分:2)

你可以array_walk_recursive($numbers, 'make_abs');

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

修改

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

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

array_walk_recursive($numbers, 'make_abs');

此示例适用于多维数组。

答案 2 :(得分:2)

您的变体使用引用(这不能解决您的递归问题,只是FYI):

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

对于递归问题,您需要进入每个数组:

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

PHP本身有一个方便的功能,array_walk_recursiveDocs。该函数的问题是,它期望回调有两个参数,值(通过引用)和键。许多PHP函数不符合这些要求。您可以通过创建自己的辅助函数来解决这个问题,以使用只接受一个参数并返回修改后的值的任何函数。您像array_mapDocs一样传递函数:

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

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

希望这有用。