嵌套的多维数组到单个多维数组

时间:2017-07-01 20:01:19

标签: php arrays multidimensional-array

我找到了很多将多维数组转换为单维数组的例子。我需要将数组中的数据保存在一起,只需将它们从嵌套中移出并放入第一个主数组中。

这是数组:

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_mergearray_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]);
    },
    []);
}

1 个答案:

答案 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;
    }
});