我找到了很多将多维数组转换为单维数组的例子。我需要将数组中的数据保存在一起,只需将它们从嵌套中移出并放入第一个主数组中。
这是数组:
Array
(
[0] => Array
(
[id] => 2
[username] => user2
[downline] => Array
(
[0] => Array
(
[id] => 5
[username] => user5
[downline] => Array
(
[0] => Array
(
[id] => 9
[username] => user9
[downline] => Array
(
[0] => Array
(
[id] => 15
[username] => user15
)
[1] => Array
(
[id] => 16
[username] => user16
)
)
)
[1] => Array
(
[id] => 10
[username] => user10
[downline] => Array
(
[0] => Array
(
[id] => 17
[username] => user17
)
)
)
)
)
)
)
[1] => Array
(
[id] => 3
[username] => user3
[downline] => Array
(
[0] => Array
(
[id] => 6
[username] => user6
[downline] => Array
(
[0] => Array
(
[id] => 11
[username] => user11
[downline] => Array
(
[0] => Array
(
[id] => 18
[username] => user18
)
)
)
)
)
)
)
[2] => Array
(
[id] => 4
[username] => user4
[downline] => Array
(
[0] => Array
(
[id] => 7
[username] => user7
[downline] => Array
(
[0] => Array
(
[id] => 12
[username] => user12
[downline] => Array
(
[0] => Array
(
[id] => 19
[username] => user19
)
)
)
)
)
[1] => Array
(
[id] => 8
[username] => user8
[downline] => Array
(
[0] => Array
(
[id] => 13
[username] => user13
)
[1] => Array
(
[id] => 14
[username] => user14
)
)
)
)
)
)
这是为所有团队成员发送消息。我不关心他们是谁,我只需要一个完整运行的所有用户列表,所以我可以循环并在系统中发送消息。
所以这是我想要得到的最终数组的一个例子:
[
[id] => 2
[username] => user2
],
[
[id] => 5
[username] => user5
],
[
[id] => 9
[username] => user9
],
[
[id] => 15
[username] => user15
],
[
[id] => 16
[username] => user16
],
[
[id] => 10
[username] => user10
],
[
[id] => 17
[username] => user17
],
[
[id] => 3
[username] => user3]
],
// ... and so on
理想情况下,数组键可以是其用户ID。这将在一个下拉菜单中,他们可以选择他们的团队成员,或者他们可以发送所有这些成员。像这样:
[
1 => 'user1',
2 => 'user2',
9 => 'user9',
]
我尝试了array_merge
,array_walk_recursive
的各种变体..所有东西都把它变成了一个丑陋的一维数组......
像这样的东西,它不起作用:
function flatten(array $arr) {
return array_reduce($arr, function ($c, $a) {
return is_array($a) ? array_merge($c, flatten($a)) : array_merge($c, [$a]);
},
[]);
}
答案 0 :(得分:2)
使用array_walk_recursive
函数的解决方案(收集连续的 id / username 对):
// $arr is your initial array
$result = [];
array_walk_recursive($arr, function($v, $k) use (&$result){
if ($k == 'id') $result[] = ['id'=> $v];
if ($k == 'username') {
$result[count($result)-1]['username'] = $v;
}
});