PHP 从单个数组创建多维数组


php creating multi-dimension array from single array

我在单个数组中有一个数组列表,我正在尝试基于直线经理制作多维度。因此,在下面的例子中,Miriam Wood管理Alan Haworth和Guy Kahane,Guy Kahane根据Line Manger字段管理Matthew Baum和Rebecca Roache。所以我目前的数组看起来像这样。

希望从

  1. 米里亚姆·伍德 - 无直线经理
  2. 艾伦·汉沃斯 - 直线经理 -> ID 1
  3. 盖伊·卡哈内 - 直线经理 -> id 1
  4. 马修·鲍姆 - 直线经理 -> ID 3
  5. 丽贝卡·罗奇 - 直线经理 -> 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)的优秀人员。

希望这有帮助。