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