遍历数组数据的最便宜的方法

时间:2014-02-21 21:31:45

标签: php

我有一组用户和部门组,如下所示:

**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循环?

2 个答案:

答案 0 :(得分:1)

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

Big O表示法

好吧,我肯定不是大学里最聪明的学生,但我记得的是,当涉及复杂性时,我们有“Big O Notation”。

所以让我们试着讨论一下你想要做什么。我有一个大小为 n 的数组Users和另一个大小为 m 的数组Departments

您想要的是UsersDepartmens之间的关联,正如您所说,您“需要打印用户阵列中的所有用户及其部门”。因此,您至少有 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设置中增加内存使用量。