我在单个数组中有一个数组列表,我正在尝试基于直线经理制作多维度。因此,在下面的例子中,Miriam Wood管理Alan Haworth和Guy Kahane,Guy Kahane根据Line Manger字段管理Matthew Baum和Rebecca Roache。所以我目前的数组看起来像这样。
希望从
- 米里亚姆·伍德 - 无直线经理
- 艾伦·汉沃斯 - 直线经理 -> ID 1
- 盖伊·卡哈内 - 直线经理 -> id 1
- 马修·鲍姆 - 直线经理 -> ID 3
- 丽贝卡·罗奇 - 直线经理 -> ID 3
自
- 米里亚姆·伍德
- 艾伦·汉沃斯
- 盖伊·卡哈内
- 马修·鲍姆
- 丽贝卡·罗奇
[98] => Array ([Id] => 1, [Name] => Miriam Wood, [Line Manager] => None)
[99] => Array([Id] => 2, [Name] => Alan Haworth, [Line Manager] => 1)
[105] => Array([Id] => 3, [Name] => Guy Kahane, [Line Manager] => 1)
[106] => Array([Id] => 4, [Name] => Matthew Baum, [Line Manager] => 3)
[107] => Array([Id] => 5, [Name] => Rebecca Roache, [Line Manager] => 3)
我想把它改成
(
[98] => Array
(
[Id] => 1
[Name] => Miriam Wood
[Line Manager] => None
[Staffs] => Array
(
[99] => Array
(
[Id] => 2
[Name] => Alan Haworth
[Line Manager] => 1
)
[105] => Array
(
[Id] => 3
[Name] => Guy Kahane
[Line Manager] => 1
[staffs] => Array
(
[106] => Array
(
[Id] => 4
[Name] => Matthew Baum
[Line Manager] => 3
)
[107] => Array
(
[Id] => 5
[Name] => Rebecca Roache
[Line Manager] => 3
)
)
)
)
))
这是一个简单的例子。
$head = array("id">1,"name"=>"Harshana","servents"=>array(
"s1"=>array("id">1,"name"=>"abc"),
"s2"=>array("id">2,"name"=>"sdf"),
"s3"=>array("id">3,"name"=>"fgh")
));
print_r($head);
echo "<hr />";
print_r($head["servents"]);
echo "<hr />";
print_r($head["servents"]["s1"]);
echo "<hr />";
$s1 = $head["servents"]["s1"];
echo "servent 1 name :".$s1["name"];
希望你能对你的问题有所了解。
我试图解决你的问题。我做了 3 个函数,以将每个函数的职责降至最低。它如下所示:
function build_employee_hierarchy(array $employees) {
$groups = build_employee_groups($employees);
$hierarchy = build_employee_group_inheritance($employees, $groups);
return $hierarchy[0];
}
function build_employee_group_inheritance(array $employees, array $groups) {
$hierarchy = [];
foreach($employees as $key => $employee) {
$employee_id = $employee['id'];
$hierarchy[$key] = $employee;
if(!array_key_exists($employee_id, $groups)) {
continue;
}
$hierarchy[$key]['staff'] = build_employee_group_inheritance($groups[$employee_id], $groups);
}
return $hierarchy;
}
function build_employee_groups(array $employees) {
$groups = [];
foreach($employees as $employee) {
if(array_key_exists('line-manager', $employee) && !is_null($employee['line-manager'])) {
$groups[$employee['line-manager']][] = $employee;
}
}
return $groups;
}
这些职能首先对属于同一直线经理的所有员工进行分组。然后递归解析员工的继承。函数build_employee_hierarchy
用作通过提供单个数组来构建整个层次结构的实用方法。
使用您提供的数据,结果将如下所示。唯一的区别是,当没有直线管理器时,它等于NULL
而不是字符串none
。
array (size=4)
'id' => int 1
'name' => string 'Miriam Wood' (length=11)
'line-manager' => null
'staff' =>
array (size=2)
0 =>
array (size=3)
'id' => int 2
'name' => string 'Alan Haworth' (length=12)
'line-manager' => int 1
1 =>
array (size=4)
'id' => int 3
'name' => string 'Guy Kahane' (length=10)
'line-manager' => int 1
'staff' =>
array (size=2)
0 =>
array (size=3)
'id' => int 4
'name' => string 'Matthew Baum' (length=12)
'line-manager' => int 3
1 =>
array (size=3)
'id' => int 5
'name' => string 'Rebecca Roache' (length=14)
'line-manager' => int 3
这可能不是最有效的解决方案,但因为如果使用递归,数组可以根据需要长。
产科
如果数据来自关系数据库,则很可能有一种更有效的方法,通过使用数据库使用的 SQL 语言以相同的形式检索数据。如果是这种情况,请询问数据库管理员(Stackexchange)的优秀人员。
希望这有帮助。