2014-02-21 48 views
0

我有用户和系组数组作为下:最便宜的方法来遍历数组数据

**users:** 
Array 
(
    [0] => Array 
     (
      [Name] => John 
      [City] => New York 
     ) 

    [1] => Array 
     (
      [Name] => Amy 
      [City] => San Francisco 
     ) 
    [3] => Array 
     (
      [Name] => Jacob 
      [City] => Seattle 
     ) 
) 

**departmentgroups** 
Array 
(
    [0] => stdClass Object 
     (
      [name] => HR 
      [member] => Array 
       (
        [0] => John 
        [1] => Jake 
        [2] => Amy 
        [3] => Mark 
       ) 

     ) 

    [1] => stdClass Object 
     (
      [name] => Finance 
      [member] => Array 
       (
        [0] => Jacob 
        [1] => John 
        [2] => Amy 
        [3] => David 
        [4] => Ramone 
       ) 

     ) 
) 

我需要通过这两个阵列穿越打印用户阵列中的所有用户与其部门一起。所以,我最初的反应是循环访问用户数组,然后为每个用户循环访问部门数组并返回部门名称。如果它们属于多个部门,则将返回一个部门数组。

我发现这种遍历非常昂贵,需要一段时间,如果我有20000个用户和30000个部门组的列表。

有没有一种快速的方法来做到这一点,而不是for循环?

+1

这个数据已经在一个数据库?似乎创建一个查询将它们组合起来会更好 –

+0

否..数据在数组中。它来自一个API – Jake

+0

也是神圣的垃圾,30000个部门?真?我不知道这样一个企业可能存在与那么多的部门 –

回答

1

简单的回答:没有有效的方法。不要刻意去阅读这篇文章我写的,我只是不想把它扔掉;)

大O符号

嗯,我绝对不是最聪明的学生早在大学,但什么我记得的是,当涉及到复杂性时,我们有“Big O Notation”。

因此,让我们试着讨论一下你正在尝试做什么。我有一个大小为的阵列Users n和大小为的另一个阵列Departments m

你想要的是UsersDepartmens之间的关联,正如你所说的,你“需要打印用户数组中的所有用户以及他们的部门”。所以你至少有一个复杂的n(因为你需要Users阵列中的所有用户)。

现在我们来看看departments阵列。正如我们从你的例子中可以看到的,约翰在人力资源部门和金融部门。所以用户可以为几个部门工作。这意味着,真是太遗憾了,我们必须循环整个departments以确保我们不会错过用户正在为之工作的部门之一。我们记得,departments阵列的大小为m

因此,对于每一个用户,我们通过米在departments项目具有循环。对于第一个用户m项目,对于第二个用户m项目等。由于我们有n用户,我们的复杂性是O(n*m)

正如您可能已经注意到的那样,这永远不会有效!而且世界上没有阵列功能,甚至不用另一种语言,这可以使这种效率更高。

或当然,我不知道所有的用例。如果你只需要编译一次这个列表,我建议你这样做。每个“优化”可能会引入错误,使代码难以调试。

如果你不熟悉的大O符号的复杂性,想一想下面,我把它叫做

数据库方式

你有所有用户一个表,一个表的所有部门。由于一个用户可能在许多部门,一个部门可能有很多用户,因此您将有一个连接表,如user_id | department_id,我们称之为users_to_departments。当然,你可能会认为,你的users_to_departments表肯定会小于n*m。但要填写它,首先必须将所有用户添加到表users,然后在填写表departments时,必须在users中查找用户的ID。

但停下来,你说用户名是独一无二的!因此,使用这个“名称”字段作为我所谓的user_id,在这里,我们走了,我们从users表中找到每个用户。

现在你可以做一个简单的SELECT * FROM users_to_departments ud JOIN users u ON u.id = ud.user_id JOIN departments d ON d.id = ud.department_id ORDER BY ud.user_id, ud.department_id来得到你的名单。只要记住,一个用户将在x时间内,在x部门。

结论

而且,如果你问我,我不认为这会更快,因为你必须从WebService所有的数据传输到数据库,从数据库中请求,并改造其响应。对我而言,这听起来更容易出错,而且效率更高。