Php 替换嵌套的foreach循环
我正在寻找一种方法,用函数式编程方法替换嵌套的foreach循环。情况如下:Php 替换嵌套的foreach循环,php,functional-programming,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)
$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>';
foreach($modeas$key=>$value):
foreach(价值为$v):
$modes[$v]=$key;
endforeach;
endforeach;
回显“”。打印($modes,1)。“”;
生成所需的输出,如下所示:
有人知道如何用函数式编程替代方案替换foreach代码块吗?我将使用创建模式数组,然后将它们合并为一个:
$modes = [];
foreach ($mode as $key => $value) {
$modes += array_fill_keys($value, $key);
}
为了便于阅读,你可以把它分成多行,但这会让你有一个想法
额外好处:如果您不确切了解$mode
的内容,则可以进一步抽象此代码:
<?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);
}
在数组中同时对交换密钥和val使用数组翻转: 但由于您希望使用多维数组,因此应该有一个循环:
Array
(
[1] => 0
[2] => 1
[5] => 2
[6] => 3
)
Array
(
[3] => 0
[4] => 1
[7] => 2
[8] => 3
)
您可以使用
array\u map()
我不知道您为什么要这样做,foreach的版本对我来说似乎更清晰。我认为数组_walk()
与联合操作符合作,并且数组_fill_keys()
似乎是完成此任务的一个干净选择:
代码:()
输出:
使用
array\u map()
请看我的答案。它被不公平地否决了,但这是解决这个问题最短、最简单的有效办法。我将在一位中添加一个额外的代码块。此输出与OP提供的所需输出不匹配。您能概括为两个以上的元素吗?为什么是-1?这正是OP想要的。通过使array\u fill\u keys
第二个参数等于$key
@K.thomas,您总是可以使用foreach来进一步抽象这一点。实际上,您打印的变量是错误的。您打印的是$mode
而不是$modes
,如果您纠正了这一点,您会看到输出与OP的值相等。在第二个版本中,您仍然有一个foreach
循环。你能让它也起作用吗?@Marijke Luttekes-你的foreach方法远远优于我最初的嵌套foreach循环。然而,我真的在为这个问题寻找一个函数式编程解决方案。它是函数式的,但我同意@Barmar的观点,即foreach
看起来更清晰。这根本不起作用,因为和$modes
会产生副作用,并且因为您放弃了外部/内部映射的返回值
@ftor,我认为他打算“功能性”是指“通过调用高阶函数”,不是纯函数式编程的无副作用意义上的。好吧,现在OP认为FP导致了费劲且难以理解的代码,而没有任何优势。对于纯函数式代码来说,情况并非如此。另外,也许FP标签应该用高阶函数替换。
Array
(
[1] => 0
[2] => 1
[5] => 2
[6] => 3
)
Array
(
[3] => 0
[4] => 1
[7] => 2
[8] => 3
)
array_map(function($key, $value) use (&$modes) {
array_map(function($v) use (&$modes) {
$modes[$v] = $key;
}, $value);
}, array_keys($mode), array_values($mode));
$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,
)