在PHP中翻转二维关联数组

7

我需要将一个以父节点为主的数组转换为以子节点为主的数组。例如,我有以下这个数组:

[
    1 => [a,b,c],
    2 => [b,c,d],
    3 => [c,d,e],
]

我希望您能将其转化为以下内容:

[
    a => [1],
    b => [1,2],
    c => [1,2,3],
    d => [2,3],
    e => [3]

]

有没有一种方法可以在不使用嵌套foreach循环的情况下完成这个任务?如果没有,最有效的方法是什么?
提前感谢!
3个回答

6

使用 array_merge_recursivearray_combinearray_fill 函数的简短解决方案:

$arr = [
    1 => ['a','b','c'],
    2 => ['b','c','d'],
    3 => ['c','d','e'],
];

$result = [];
foreach ($arr as $k => $v) {
    $result = array_merge_recursive($result, array_combine($v, array_fill(0, count($v), [$k])));
}

print_r($result);

输出结果:
Array
(
    [a] => Array
        (
            [0] => 1
        )

    [b] => Array
        (
            [0] => 1
            [1] => 2
        )

    [c] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [d] => Array
        (
            [0] => 2
            [1] => 3
        )

    [e] => Array
        (
            [0] => 3
        )
)

2

就“效率”而言,我认为在这种情况下使用嵌套循环更好:

$arr = [1 => ['a','b','c'],
        2 => ['b','c','d'],
        3 => ['c','d','e']];

$result = [];
foreach ($arr as $key => $value) {
    foreach ($value as $v) {
        $result[$v][] = $key;
    }
}

var_dump($result);

尝试对其他函数(如array_map)进行创新可能会变得更慢,至少根据这个答案的说法。也许值得运行一些自己的基准测试。


0

使用闭包和array_map(只能希望array_map比等效的for循环执行得更快...它不应该是本地函数吗?)。

$multimap=[
    1 => [a,b,c],
    2 => [b,c,d],
    3 => [c,d,e],
];

$result=[];
foreach($multimap as $k=>$arr) {
  $callme=function($e) use (&$result, $k) {
    if( ! array_key_exists ($e, $result) ) {
      $result[$e]=[];
    }
    $result[$e][]=$k;
    return $e; // not that it matters what is returned, we're after the side-effects
  };
  array_map($callme, $arr);
}

// just as yet another alternative to var_dump/print_r
echo json_encode($result /*, JSON_PRETTY_PRINT */)."\n";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接