2014-10-04 26 views
0

我正在移植一些舊的PHP腳本來實現更好的性能。但是,舊的PHP充滿了多維數組。從代碼庫的一些摘錄:Go或Rust中數組的數組?

while (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false) { 
    $someData[$row['column_a']][$row['column_b']] = $row; 
} 

// ... more queries and stuff 

if (isset($moreData['id']) && isset($anotherData['id']) && $someData[$anotherData['id']][$moreData['id']]) { 
    echo $someData[$anotherData['id']][$moreData['id']]; 
} 

太可怕了,我知道,但我不能改變的邏輯。通過編譯phc,我使整個腳本表現得更好,但轉向程序化,靜態類型的語言似乎是更好的舉措。我怎樣纔能有效地使用Go或Rust來複制這些數據結構?當涉及到檢查索引時,它需要具有容錯能力,腳本週圍有很多issets來檢查數據結構中是否存在標識符。

+0

多維關聯數組很容易(在Rust中;也可能在Go中),真正的問題是鍵和值類型是否一致,因此可以在靜態類型系統中描述。 – delnan 2014-10-04 19:12:28

回答

4

在Go中,這將表示爲map。語法是map[key]value。因此,例如要存儲[string, string] -> int的多維地圖,它將是map[string]map[string]int。如果你知道你的索引是整數並且密集的,那麼你會想要使用切片。這些更簡單,看起來像[][]type

至於檢查的關鍵現有的,使用此語法,其中m爲地圖:

if val, ok := m[key1][key2]; ok { 
    ///Do something with val 
} 

記住,一鍵添加到多維地圖,你就必須確保內部地圖在添加之前分配。

if _, ok := m[key]; !ok { 
    m[key] = make(map[string]int) 
} 
m[key1][key2] = value 

很明顯,你想要把它包裝在一個帶有方法或幾個簡單函數的類型中。

2

PHP數組實際上關聯數組,也稱爲映射字典。 Rust在其標準庫中使用地圖Map traita variety of implementations提供了一個接口。特別是,這個特徵定義了一個contains_key方法,您可以使用它來檢查地圖是否包含特定的鍵(而不是寫入isset($array[$key]),您編寫map.contains_key(key))。

Map有兩個類型參數:K是地圖的鍵類型(即用作索引的值),而V是地圖值的類型。

如果您需要您的地圖包含各種類型的鍵和/或值,則需要使用Any trait。例如,如果鍵是字符串且值是各種類型,則可以使用HashMap<String, Box<Any>>Box是必需的,因爲特徵對象未定義;有關更多信息,請參閱this answer)。查看AnyRefExtAnyMutRefExt的文檔,瞭解如何使用Any值。但是,如果可能的類型相對有限,則可能更容易定義自己的特徵並使用該特徵而不是Any,以便您可以在這些類型上實現操作,而無需在需要的任何地方明確地進行轉換使用這些值(另外,您可以通過添加impl來添加類型,而無需更改所有使用值的位置)。

+0

你是否建議用於Rust的任何MySQL庫? – vinnylinux 2014-10-04 20:18:16

+0

Thia答案很好,但建議Rust,完全忽略GO。 Rust看起來非常非常突出,但它還沒有達到1.0,並且在生產中使用它非常危險,因爲API可能隨時崩潰。如果它的發展不打算用於生產 - 繼續前進吧,它很適合在大多數人面前知道新鮮和優秀的語言:)。 – Jarema 2014-10-05 03:01:20