31. oktober 2018 - 11:59Der er
50 kommentarer og 2 løsninger
Kombinere mange id'er til en kort string.
Hejsa
Jeg har en lang række id'er ("normalt" mellem 1000 og 1 million stk.) jeg skal have kortet ned til en lille streng ala [1-1000] eller [1-243, 355-9876]. Altså kan jeg ikke regne med at de er i rækkefølge.
Prøv at sige lidt om, hvordan du "har" dem: Ligger de i et array eller i enkeltstående variable? Er der nogen logik i, hvordan de er gemt? Er det vigtigt at den resulterende streng har en bestemt rækkefølge?
De kommer fra en database, så array er vel mest nærliggende. :)
De bliver gemt i grupper af forskellige størrelser - derfor de 1000 <-> 1 million.
Rækkefølgen er vigtig på den måde, at det skal være muligt at "rode" den ud igen til visning på skærmen. Her i kombination med andre række i tabellen.
Helt overordnet er dette en del af en form for breadcrumb spor, som ikke skal fylde for meget, men stadig skal kunne vises til brugeren. Altså at man kan følge eet id hele vejen.
Nu spurgte du jo til det nemmeste og hurtigste, og her vil jeg mene, at json_encode må være svaret, da den jo klemmer et array ned til en streng -- der så igen kan gøres til et array vha. json_decode.
Men det kan godt være, den ikke helt lever op til dit tilføjede ønske om også at skulle "fylde for meget".
Så mangler jeg "bare" at vide mig sikker på, at det er nemt at finde "stien" i disse strenge efterfølgende...ja, det burde jeg nok have startet med! :D
Altså, når jeg har rækker som disse: 1-5,7,9-12,15-16 1-3,9-12 2-5,15-16 1-7,9-12
Og derefter vil se de rækker hvor f.eks. 2 eller 10 er med.
Jamen, data er jo dem vi laver i starten af spørgsmålet - de skal jo smides ind i en database, for så at kunne hive det ud igen på den nævnte måde. :)
Prekonditioner: 1: id'er er oprettet i databasen i anden tabel - er gjort 2: Nogle id'er skal skifte ejer - dette ejerskifte skal registres for hvert id - er gjort med løsningen i #7, taget fra dit link i #6. :)
Derefter: 3: Søg efter eet id i alle rækker og vis dem
Mange rækker i en database er vel intet problem. Hvordan vil du ellers komme det i databasen? jeg synes dette er at foretrække i forhold til en masse tekststrenge, som du ikke kan søge i.
Fordelen med #25 er, at du kan finde alle nåle i høstakken med én SELECT.
Alternativet er, at hive alle data ud af databasen 8som så har færre rækker) en række ad gangen og køre PHP for at finde ud af om der er et match. Jeg gætter på, at det er meget mindre effektivt.
Men det er ret let at teste:
1. Lav to tomme tabeller i databasen - en med tekst-strenge og en som i #25. husk index på minid og maxid 2. Lav x tusind tilfældige tal i stigende rækkefølge om fyld dem i begge tabeller 3. Kør en test og tag tid 4. Fortæl her om resultatet
og dens data kommer herfra: $result = mysqli_query($mysqli, 'SELECT SeedID FROM '.UBIC_ProtoUBISeeds.' WHERE CurrentOwnerAID='.$FromAID.' ORDER BY SeedID ASC LIMIT '.$Amount); if ($result) { while ($row = $result->fetch_assoc()) { $array[] = $row; } $SeedIDs[] = CombineSeedIDs($array); ... }
Jeg vil mene, at hver gang du bruger en værdi fra $item, skal der stå ($item["SeedID"]. Til gengæld er ideen, at $prev og $start skal være værdier, så sammenligningen skal være:
if ($item["SeedID"] != ($prev + 1)) {
Endelig er der et problem (der muligvis ikke betyder noget, men er dårlig kode) med initialisering af $newarr og $prev. Det vil i hvert fald ikke køre i PHP 7.
Så tror jeg, at jeg siger tak for kampen - og tålmodigheden! :) :D
Det var ikke så lidt. :) :)
Synes godt om
Ny brugerNybegynder
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.