【问题标题】:php creating multi-dimension array from single arrayphp从单个数组创建多维数组
【发布时间】:2015-01-15 10:42:26
【问题描述】:

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

想从

做一些事
  1. Miriam Wood - 没有直线经理
  2. Alan Hanworth - 直线经理 -> id 1
  3. Guy Kahane - 直线经理 -> id 1
  4. Matthew Baum - 直线经理 -> id 3
  5. Rebecca Roache - 直线经理 -> 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
            )
        )
    )
)

) )

【问题讨论】:

  • 如果这些数据来自数据库,我会说有更有效的方法来完成您尝试使用数据库正在使用的 SQL 语言执行的操作。如果是这种情况,请尝试在 Database Administrators (Stackexchange) 上询问

标签: php arrays multidimensional-array


【解决方案1】:

这是一个简单的例子。

$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"];

希望你能对你的事情有所了解。

【讨论】:

    【解决方案2】:

    我已尝试解决您的问题。我已经制定了 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
    

    这可能不是最有效的解决方案,但因为如果使用递归,数组可以是任意长的。

    OBS

    如果数据来自关系数据库,则很可能有一种更有效的方法可以使用数据库使用的 SQL 语言以相同的形式检索数据。如果是这种情况,请通过 Database Administrators (Stackexchange) 询问很棒的人。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-09-25
      • 2021-10-26
      • 1970-01-01
      • 2022-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多