php 从二维数组的二级值和一级键创建平面关联数组

xfb7svmp  于 2023-01-19  发布在  PHP
关注(0)|答案(4)|浏览(144)

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

这将生成所需的输出(可将其视为翻转2D阵列):

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

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

lrpiutwd

lrpiutwd1#

您可以使用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版本对我来说似乎更清楚。

u1ehiz5o

u1ehiz5o2#

我认为array_walk()与Union Operator合作,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_reduce(),并使用这些键访问第二级子数组。

var_export(
    array_reduce(
        array_keys($mode),
        fn($result, $k) => $result += array_fill_keys($mode[$k], $k),
        []
    )
);

输出(来自任一代码段):

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

n3schb8v3#

我将使用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);
}
0wi1tuuw

0wi1tuuw4#

使用array_flip在数组中交换键和瓦尔:
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);
}

?〉
输出:

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

相关问题