用函数式编程方法替换foreach循环

时间:2017-12-17 14:20:51

标签: php functional-programming

下面是一个向数组键添加常数的函数示例 -

function addConstantToArrayKeys($seed_array, $constant)
{
    foreach($seed_array as $key => $value){
        $a[$key + $constant] = $value;
    }
    return $a;
}

$basearray = [1 => 17, 2 => 24, 3 => 12];
$test = addConstantToArrayKeys($basearray, 19);

此示例的结果是:

Array
(
    [1] => 17
    [2] => 24
    [3] => 12
)

Array
(
    [20] => 17
    [21] => 24
    [22] => 12
)

它可以按预期工作,但是可以使用可以实现相同结果的函数式编程方法以某种方式重写此方法吗?

我试过这个:

function addConstantToArrayKeys($seed_array, $constant)
{
    return array_map(function($key, $element) use($constant)
         {return $a[$key + $constant] = $element;},
          array_keys($seed_array), array_values($seed_array));
}

但它没有按要求处理键。这是输出 -

Array
(
    [1] => 17
    [2] => 24
    [3] => 12
)

Array
(
    [0] => 17
    [1] => 24
    [2] => 12
)

修改 感谢Progrock的回答,这很有效 -

function addConstantToArrayKeys($seed_array, $constant)
{
    return array_combine(array_map(
        function($key) use($constant) {
            return $key + $constant;
        }, array_keys($seed_array)), $seed_array);
}

2 个答案:

答案 0 :(得分:2)

可能为时已晚,但这应该适合您,因为您需要功能性方法。

function addConstantToArrayKeys($basearray, $constant){

  $arrayReindexed = [];
  array_walk($basearray,function($v,$k) use (&$arrayReindexed, $constant) {
      $key = $k;
      $k = $key + $constant;
      $arrayReindexed[$k] = $v;
  });

   return $arrayReindexed;
}

$basearray = [1 => 17, 2 => 24, 3 => 12];
$test = addConstantToArrayKeys($basearray, 19);
print '<pre>';
print_r($test);
print '</pre>';

输出

Array (
     [20] => 17
     [21] => 24
     [22] => 12
 )

答案 1 :(得分:0)

你可以使用像这样不可读的东西。它不会改变现有的数组键。

<?php
$nums = [
    1 => 17,
    2 => 24,
    3 => 12
];

$out = array_combine(array_map(
    function($int) {
        return $int + 10;
}, array_keys($nums)), $nums);

var_export($out);

输出:

array (
    11 => 17,
    12 => 24,
    13 => 12,
  )

您的第一个示例非常实用且可读,但是用于命名。

<?php

$nums = [
    1 => 17,
    2 => 24,
    3 => 12
];

$add_num_to_keys = function (array $in, $num) {
    $out = [];
    foreach($in as $k => $v)
        $out[$k + $num] = $v;

    return $out;
};


$out = $add_num_to_keys($nums, 10);
var_export($out);

输出:

array (
    11 => 17,
    12 => 24,
    13 => 12,
  )

你做不到:

foreach($in as &$k => $v)
    $k += 10;

由于关键元素不能作为参考。