在 PHP 中翻转 two-dimensional 关联数组
Flip two-dimensional associative array in PHP
我需要将 parents 到 children 的数组转换为 children 到 parents 的数组。例如,我有一个这样的数组:
[
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 循环来完成这个任务的方法?如果没有,最有效的方法是什么?
提前致谢!
使用 array_merge_recursive
、array_combine
和 array_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
)
)
就 "efficiency" 而言,我认为在这种情况下,嵌套循环更好:
$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
may turn out to be slower, at least according to this answer 等其他功能发挥创意。可能值得 运行 您自己的一些基准。
使用闭包和 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";
我需要将 parents 到 children 的数组转换为 children 到 parents 的数组。例如,我有一个这样的数组:
[
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 循环来完成这个任务的方法?如果没有,最有效的方法是什么?
提前致谢!
使用 array_merge_recursive
、array_combine
和 array_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
)
)
就 "efficiency" 而言,我认为在这种情况下,嵌套循环更好:
$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
may turn out to be slower, at least according to this answer 等其他功能发挥创意。可能值得 运行 您自己的一些基准。
使用闭包和 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";