Avatar billede prince10 Nybegynder
25. april 2003 - 14:26 Der er 9 kommentarer og
1 løsning

Array fjern dubletter

Jeg har en favoritliste (profilsystem), hvor favoritter bliver listet på en side. Favoritter er gemt i db i feltet favorite_users som et array af ID'er- ( ex. 1,4,6)
På visningssiden er der checkboxe med value=<%userid%>
så er det meningen at man skal kunne afkrydse de favoritter som man ønsker at fjerne fra listen.
jeg sender data til updatefavorites.asp og har her 2 arrays

Hele favoritlisten:
mailuserid= request.cookies("username")("userid")
Set rs = Server.CreateObject("ADODB.RecordSet")
strSQL = "SELECT users.favorite_users FROM users WHERE users.userid=" & mailuserid
RS.CursorLocation = adUseClient
rs.Open strSQL, conn, 1, 1
If Not rs.EOF Then
Favorit_Users=rs("Favorit_Users")&""
arr1=Favorit_Users
end if
'her udskrives arr1
response.write arr1 &"<br>"
%>
De favoritter der skal fjernes
<%
for each item in request.form
if request.form(item)<>"" then
arr2=request.form(item)
end if 
next
'her udskrives arr2
response.write arr2
%>
Hvordan får jeg så et tredie array arr3 som er lig med
arr1 - arr2 - altså hvor dubletter er fjernet
Avatar billede -master-d- Nybegynder
25. april 2003 - 15:19 #1
Forstår jeg dig ret at du gerne vil have arr3 til at være arr1 uden de favoritter som skal fjernes altså arr2 ???
Avatar billede eagleeye Praktikant
25. april 2003 - 15:32 #2
Du kan lave en function lige som denne som kan fjerne et element fra et array ud fra den værdi som er i arrayet:


Sub RemoveFromArray(aList, RemoveThis)
Dim I
for i = LBound(aList) to UBound(aList)
  if Cstr(aList(i)) = Cstr(RemoveThis) then
    RemoveThisIndex = i
    exit for
  end if
next
if RemoveThisIndex = "" then exit Sub
If RemoveThisIndex > UBound(aList) Then
  Exit Sub
End If
If RemoveThisIndex < UBound(aList) Then
  ' Shuffle the elements down
  For I = RemoveThisIndex + 1 to UBound(aList)
      aList(I - 1) = aList(I)
  Next
End If
ReDim Preserve aList(Ubound(aList) - 1)
End Sub



Så kan du lave din koden sådan her som så giver dif arr3 med som i princippet er arr1-arr2


arr1arr = Split(arr1, ",")

arr2arr = Split(arr2, ",")

for i = lbound(arr2arr) to ubound(arr2arr)
  RemoveFromArray arr1arr,arr2arr(i)
next
for i = lbound(arr1arr) to ubound(arr1arr)
  arr3 = arr3 & "," & arr1arr(i)
next
if arr3 <> "" then arr3 = Mid(arr3,2) 'Fjerner føste komma

Response.Write arr3
Avatar billede jespernaur Nybegynder
25. april 2003 - 15:42 #3
Her er en anden måde, hvor der ikke 'shuffles' så meget:

  ' Split de 2 strenge og opnå 'rigtige' arrays
  a1 = Split(arr1, ",")
  a2 = Split(arr2, ",")

  ' Start med tomt arr3
  arr3 = ""

  for inx1 = 0 to UBound(a1)
      dublet = false
      for inx2 = 0 to UBound(a2)
        if a1(inx1) = a2(inx2) then
            dublet = true
        end if
      next
      if not dublet then
        arr3 = arr3 & a1(inx1)
        if inx1 < UBound(a1) then
            arr3 = arr3 & ","
        end if
      end if
  next

  Response.Write arr3
Avatar billede eagleeye Praktikant
25. april 2003 - 16:05 #4
Man kan endag lave det med string functioner så kan koden laves sådan her, så løber man kun genne det array som skal fjernes, det forudsætter dog at der i arr1 ikke er mellemrum mellem , og tal eks "1,23,4,6" virker mend "1, 23, 4, 6" virker ikke.


'Lav arr2 til et array
arr2arr = Split(arr2, ",")
'Sæt komma ind før og efter i arr1 så der er noget at søge efter.
arr1 = "," & arr1 & ","
for i = lbound(arr2arr) to ubound(arr2arr)
  index = InStr(1, arr1, "," & arr2arr(i) & ",")
  if index > 0 then
    arr1 = Left(arr1,index) & Mid(arr1,inStr(index+1, arr1, ",")+1)
  end if
next
arr3 = Mid(arr1,2,len(arr1)-2)

Response.Write arr3
Avatar billede prince10 Nybegynder
25. april 2003 - 16:18 #5
Ja alle tre virker jo... Dog mangler jeg at man kan slette mere end en på listen af gangen - kan det ikke lade sig gøre?
Avatar billede eagleeye Praktikant
25. april 2003 - 16:21 #6
Den skulle gerne slette dem som er i arr2, hvis du overføre 4,5,6 så sletter den 4, 5 og 6.

Den sidste jeg har vist skal denne linje:
  index = InStr(1, arr1, "," & arr2arr(i) & ",")

rettes til:
index = InStr(1, arr1, "," & Trim(arr2arr(i)) & ",")
Avatar billede prince10 Nybegynder
25. april 2003 - 16:34 #7
Så virker det - herligt - Tak for hjælpen
Avatar billede prince10 Nybegynder
25. april 2003 - 16:43 #8
Ups - Når jeg prøver at slette den sidste på listen:
Set rs1 = Server.CreateObject("ADODB.RecordSet")
strSQL = "UPDATE users SET users.Blocked_Users='" & arr3 & "' WHERE userid=" & mailuserid
RS1.CursorLocation = adUseClient
rs1.Open strSQL, conn, 1, 1
response.redirect "favorites.asp"
Får jeg flg:
Microsoft VBScript runtime error '800a0005'
Invalid procedure call or argument: 'Mid'
hvad så...
Avatar billede eagleeye Praktikant
25. april 2003 - 16:49 #9
Hmm det var ikke så godt, der er vist fordi arr1 så bliver tom.:

Prøv at lave denne linje:

arr3 = Mid(arr1,2,len(arr1)-2)


Om til dette:
if len(arr1) > 1 then
  arr3 = Mid(arr1,2,len(arr1)-2)
else
  arr3 = ""
end if
Avatar billede prince10 Nybegynder
25. april 2003 - 16:52 #10
Så virker det - Endnu engang - tak for hjælpen...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester