Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 替换嵌套的foreach循环_Php_Functional Programming - Fatal编程技术网

Php 替换嵌套的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)

我正在寻找一种方法,用函数式编程方法替换嵌套的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($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,
)