我正在寻找一种用函数式编程方法替换嵌套的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>';
生成所需的输出,如下所示:
有谁知道如何用函数式编程替代foreach代码块?
答案 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:
但是因为你想要使用多维数组,你应该有一个循环:
<?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
)