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

问题描述 投票:1回答:2

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

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);
}
php functional-programming
2个回答
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;

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


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
 )
© www.soinside.com 2019 - 2024. All rights reserved.