替换嵌套的foreach循环

时间:2017-08-09 11:06:36

标签: php functional-programming

我正在寻找一种用函数式编程方法替换嵌套的foreach循环的方法。情况如下:

$mode[1] = [1, 2, 5, 6];
$mode[0] = [3, 4, 7, 8];

目前我的代码是:

foreach ($mode as $key=>$value):
  foreach ($value as $v):
    $modes[$v] = $key;
  endforeach;
endforeach;

echo '<pre>' . print_r($modes, 1) . '</pre>';

生成所需的输出,如下所示:

enter image description here

有谁知道如何用函数式编程替代foreach代码块?

4 个答案:

答案 0 :(得分:2)

您可以使用array_map()

执行此操作
array_map(function($key, $value) use (&$modes) {
    array_map(function($v) use (&$modes) {
        $modes[$v] = $key;
    }, $value);
}, array_keys($mode), array_values($mode));

我不确定为什么你想要这样做,foreach版本对我来说似乎更清楚。

答案 1 :(得分:1)

我认为array_walk()与联盟运营商合作,而array_fill_keys()似乎是此任务的一个干净选择:

代码:(Demo

$mode[1]=[1, 2, 5, 6];
$mode[0]=[3, 4, 7, 8];

$result=[]; // declare empty array so that union operator works
array_walk($mode,function($a,$k)use(&$result){$result+=array_fill_keys($a,$k);});
var_export($result);

输出:

array (
  1 => 1,
  2 => 1,
  5 => 1,
  6 => 1,
  3 => 0,
  4 => 0,
  7 => 0,
  8 => 0,
)

答案 2 :(得分:0)

我使用array_fill_keys创建模式数组,然后将它们合并为一个:

$modes = array_fill_keys($mode[1], 1) + array_fill_keys($mode[0], 0);

为了易读,您可以将其拆分为多行,但这应该让您有所了解。

额外奖励:如果您不完全了解$mode的内容,则可以进一步抽象此代码:

$modes = [];
foreach ($mode as $key => $value) {
    $modes += array_fill_keys($value, $key);
}

答案 3 :(得分:-4)

在数组中使用array_flip进行交换密钥和val:

https://3v4l.org/DeIsG

但是因为你想要使用多维数组,你应该有一个循环:

<?php
$mode[0] = array(1, 2, 5, 6);
$mode[1] = array(3, 4, 7, 8);
for($i=0;$i<2;$i++)
{
 $flipped = array_flip($mode[$i]);
 print_r($flipped);
}

&GT;

输出:

Array
(
[1] => 0
[2] => 1
[5] => 2
[6] => 3
)
Array
(
[3] => 0
[4] => 1
[7] => 2
[8] => 3
)