Каков наилучший способ управления массивом или массивами в классическом ASP - PullRequest
1 голос
/ 02 октября 2009

PHP предоставляет ассоциативные массивы, но в классическом asp такого нет. Я ищу класс или функцию, которая позволяет мне создавать и проходить иерархию, подобную этой:

United States
  Washington
    Electric City
      Banks Lake 
    Lake Chelan
      Wapato Point 
    Gig Harbour
Mexico
  Nayarit
    Aticama
Asia
  India
    Mumbai
  Pakistan
    Sindh
      Karachi

Как вы можете заметить, иерархия имеет неравномерную глубину - она ​​может иметь глубину 3, 4 или 5 уровней. Структура базы данных еще более сложная, поскольку для некоторых записей я должен начать отображать данные с уровня региона, а для других - с страны. Массив массивов действительно помог бы, но в ASP мои руки связаны.

Ответы [ 5 ]

4 голосов
/ 02 октября 2009

Соблазнительно советовать вам использовать JScript на стороне сервера вместо VBScript. Мало того, что это делает такие вещи более естественно, вы, вероятно, знакомы с языком. Недостатком является то, что подавляющее большинство инструкций в Интернете, связанных с ASP, написаны на VBScript.

Ассоциативный массив в VBScript называется Dictionary и доступен из библиотеки Scripting. Однако для создания иерархической структуры вам, вероятно, потребуется немного больше помощи. Я хотел бы создать класс вокруг Dictionary, чтобы я мог хранить больше, чем просто свойство Name, и облегчить иерархическое манипулирование.

Вот пример класса: -

Class Node
   Private myName
   Private myChildren

   Private Sub Class_Initialize()
     Set myChildren =  CreateObject("Scripting.Dictionary")
   End Sub

   Public Property Get Name()
      Name = myName
   End Property

   Public Property Let Name(value)
      myName = Value
   End Property

   Public Function AddChild(value)

     If Not IsObject(value) Then
       Set AddChild = new Node
       AddChild.Name = value
     Else
       Set AddChild = value
     End If

     myChildren.Add AddChild.Name, AddChild

   End Function


   Public Default Property Get Child(name)
     Set Child = ObjectOrNothing(myChildren.Item(name))
   End Property

   Public Property Get Children()
     Set Children = myChildren
   End Property

   Private Function ObjectOrNothing(value)
     If IsObject(value) Then
       Set ObjectOrNothing = value
     Else
       Set ObjectOrNothing = Nothing
     End If
   End Function

End Class

Теперь вы можете создать свое дерево: -

 Dim root : Set root = new Node
 With root.AddChild("United States")
   With .AddChild("Washington")
     With .AddChild("Electric City")
       .AddChild "Banks Lake"
     End With
     With .AddChild("Lake Chelan")
       .AddChild "Wapato Point"
     End With
     .AddChild "Gig Harbour" 
   End With
 End With

Теперь получите доступ к этой иерархии как: -

Sub WriteChildrenToResponse(node)
  For Each key In node.Children

    Response.Write "<div class=""node"">" & vbCrLf
    Response.Write "<div>" & root.Child(key).Name "</div>" & vbCrlF
    Response.Write "<div class=""children"">" & vbCrLf

    WriteChildrenToResponse root.Child(key)

    Response.Write "</div></div>"
  Next
End Sub

''# Dump content of root heirarchy to the response
WriteChildrenToResponse root
1 голос
/ 02 октября 2009

Вы можете поместить иерархию в XMLDOM объект и traverse поверх него таким образом.

0 голосов
/ 02 октября 2009

Я бы создал класс, который будет содержать их, что-то вроде этого:

Class Area
  Public Name
  Private _children

  Private Sub Class_Initialize()
    _children = Array()
  End Sub

  Public Property Get Children()
    Set Children = _children
  End Property

  Public Sub AddChild(newChild)
    ReDim Preserve _children(UBound(_children)+1)
    Set _children(UBound(_children)) = newChild
  End Sub
End Class
0 голосов
/ 02 октября 2009

Возможно, вы захотите взглянуть на материализованную модель пути на стороне sql. Это действительно просто работа с относительными «статическими» деревьями.

0 голосов
/ 02 октября 2009

использовать Server.CreateObject ("Scripting.Dictionary")

http://msdn.microsoft.com/en-us/library/x4k5wbx4(VS.85).aspx

...