我有一组用户和部门组,如下所示:
**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
)
)
)
我需要遍历这两个数组,打印用户数组中的所有用户及其部门。因此,我最初的反应是循环访问用户数组,然后为每个用户循环遍历departments数组并返回部门名称。如果它们属于多个部门,则会返回一个部门数组。
我发现这种遍历非常昂贵并且需要一段时间,如果我有20000个用户和30000个部门组的列表。
有没有快速的方法来代替for循环?
答案 0 :(得分:1)
简单回答:没有有效的方法。不要费心阅读我刚刚写的这篇文章,我只是不想把它扔掉;)
好吧,我肯定不是大学里最聪明的学生,但我记得的是,当涉及复杂性时,我们有“Big O Notation”。
所以让我们试着讨论一下你想要做什么。我有一个大小为 n 的数组Users
和另一个大小为 m 的数组Departments
。
您想要的是Users
和Departmens
之间的关联,正如您所说,您“需要打印用户阵列中的所有用户及其部门”。因此,您至少有 n 的复杂性(因为您需要Users
数组中的所有用户)。
现在我们来看看departments
数组。正如我们从你的例子中看到的那样,约翰在人力资源部门和财务部门工作。因此,用户可以为多个部门工作。这意味着,遗憾的是,我们总是要遍历整个departments
以确保,我们不会错过用户正在为之工作的部门之一。我们记得,departments
数组的大小为 m 。
因此,对于每个用户,我们必须遍历departments
中的 m 项目。对于第一个用户 m 项目,对于第二个用户 m 项目等。由于我们有 n 用户,我们的复杂性为{{1} }。
正如您可能已经注意到的那样,从来没有效率!世界上没有数组函数,甚至没有其他语言,这可以使这更有效。
当然,我不知道你的所有用例。如果你只需要编译一次这个列表,我建议你这样做。每个“优化”都可能引入错误并使您的代码更难调试。
如果您不熟悉Big O表示法的复杂性,请考虑以下内容,我称之为
您有一个包含所有用户的表和一个包含所有部门的表。由于一个用户可能在多个部门,一个部门可能有很多用户,因此您将拥有一个类似O(n*m)
的连接表,我们称之为user_id | department_id
。当然,您可能会认为,您的users_to_departments
表肯定会小于users_to_departments
。但要填写它,您首先必须将所有用户添加到表n*m
,然后在填写表users
时,您必须在departments
中查找用户的ID。
但是停止,你说用户名是唯一的!因此,请将此“名称”字段用作我称之为users
的字段,在此我们开始,我们不会在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
次列表中。
而且,如果你问我,我不认为这会更快,因为你必须将所有数据从webservice传输到你的数据库,从数据库请求它并转换它的响应。对我来说,这听起来更容易出错,甚至更有效率。
答案 1 :(得分:0)
查看array_merge_recursive功能。您可能需要在php.ini设置中增加内存使用量。