2014-02-21 45 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所有的數據傳輸到數據庫,從數據庫中請求,並改造其響應。對我而言,這聽起來更容易出錯,而且效率更高。