Php 如何在多维数组中组合第一个键值?

Php 如何在多维数组中组合第一个键值?,php,arrays,Php,Arrays,我有一个从CSV文件创建的数组,我希望使用每个数组中的第一个值作为键,并将数组与数组中相同的第一个值组合。所有具有[Parent]=>top的数组都应合并为一个数组[top]=>array。下面是CSV文件中的示例。MenuItem的数量未知。唯一已知的是菜单只有3个级别:深顶>Sub1>Sub2。顶部菜单的菜单项也可以更改。我需要一些可以查看第一个数组中的[Parent]键的东西,如果它等于top,那么基于键[MenuItem]创建一个数组,然后任何其他的数组,其中[Parent]=Progr

我有一个从CSV文件创建的数组,我希望使用每个数组中的第一个值作为键,并将数组与数组中相同的第一个值组合。所有具有[Parent]=>top的数组都应合并为一个数组[top]=>array。下面是CSV文件中的示例。MenuItem的数量未知。唯一已知的是菜单只有3个级别:深顶>Sub1>Sub2。顶部菜单的菜单项也可以更改。我需要一些可以查看第一个数组中的[Parent]键的东西,如果它等于top,那么基于键[MenuItem]创建一个数组,然后任何其他的数组,其中[Parent]=Programs,那么[MenuItem]&[URL]将被添加到Programs数组中

Array
(
    [0] => Array
        (
            [Parent] => top
            [MenuItem] => Home
            [URL] => /
        )

    [1] => Array
        (
            [Parent] => top
            [MenuItem] => Programs
            [URL] => /programs/
        )

    [2] => Array
        (
            [Parent] => Programs
            [MenuItem] => Programs Sub1
            [URL] => /programs/sub1/
        )

    [3] => Array
        (
            [Parent] => Programs
            [MenuItem] => Programs Sub2
            [URL] => /programs/sub2/
        )

    [4] => Array
        (
            [Parent] => Programs
            [MenuItem] => Programs Sub3
            [URL] => /programs/sub3/
        )
)
结果应该是:

Array
(
    [top] => Array
        (
            [0] => Array
                (
                     [MenuItem] => Home
                     [URL] => /
                )
            [1] => Array
                (
                    [MenuItem] => Programs
                    [URL] => /programs/
                    [Programs] => Array
                        (
                            [0] => Array
                                (
                                    [MenuItem] => Programs Sub1
                                    [URL] => /programs/sub1/
                                )
                            [1] => Array
                                (
                                    [MenuItem] => Programs Sub2
                                    [URL] => /programs/sub2/
                                )
                            [2] => Array
                                (
                                    [MenuItem] => Programs Sub3
                                    [URL] => /programs/sub3/
                                )
                )
菜单示例

Home    Programs
            Programs Sub1
            Programs Sub2
            Programs Sub3
试试这个

function loop($arr, $parent, &$result) {
    $temp = array_filter($arr, function($t) use ($parent) {
        return $t['Parent'] == $parent;
    });
    foreach ($temp as $t) {
        $parent = $t['MenuItem'];
        if (array_search($parent, array_column($arr, 'Parent')) !== FALSE) {
            $x = &$result[$t['Parent']][];
            $x = array_slice($t, 1);
            loop($arr, $parent, $x);
        }else{            
            $result[$t['Parent']][] = array_slice($t, 1);
        }
    }
}

$arr = Array
    (Array
        (
        'Parent' => 'top',
        'MenuItem' => 'Home',
        'URL' => '/',
    ),
    Array(
        'Parent' => 'top',
        'MenuItem' => 'Programs',
        'URL' => '/programs/',
    ),
    Array(
        'Parent' => 'Programs',
        'MenuItem' => 'Programs Sub1',
        'URL' => '/programs/sub1/',
    ),
    Array(
        'Parent' => 'Programs',
        'MenuItem' => 'Programs Sub2',
        'URL' => '/programs/sub2/',
    ),
    Array(
        'Parent' => 'Programs',
        'MenuItem' => 'Programs Sub3',
        'URL' => '/programs/sub3/',
    ),
    Array(
        'Parent' => 'Programs Sub2',
        'MenuItem' => 'Programs Sub2 1',
        'URL' => '/programs/sub2/1',
    ),
    Array(
        'Parent' => 'Programs Sub2',
        'MenuItem' => 'Programs Sub2 2',
        'URL' => '/programs/sub2/2',
    )
);

$result = [];

$parent = $arr[0]['Parent'];

loop($arr, $parent, $result);

var_dump($result);

它适用于任何深度的菜单,循环是一个递归函数。

输出中的程序数组是否应该有3个条目?另外,如果情况不同,如何将[Parent]=>程序与[MenuItem]=>程序配对…Nick,是的,程序数组应该有3个条目。我做了编辑来显示这一点。我不确定我是否理解第二个问题。我已经添加了一个菜单示例。没有发布编码尝试。您是否尝试过研究StackOverflow上已有的许多递归解决方案中的任何一个?比如:我想我应该解释一下网站的菜单是动态的,这就是为什么我要从CSV中提取它们。我做了一个编辑来解释这一点。@BrianC987相应地更新了答案