Avatar billede Slettet bruger
26. oktober 2009 - 12:37 Der er 10 kommentarer og
1 løsning

Array som Streng (TEXT i db) - best practice ?

I mit (hemmelige) system, gemmer jeg nogle halvstore arrays i databasen.
f.eks:
"Mogens|@|123|#|Mona|@|456|#|Bent|@|-23"

Som jeg så "exploder" til PHP-arrays når jeg skal bruge dem:
$konti = explode("|#|", $data)
$konto = explode("|@|", $konti)
- kort fortalt

Men jeg har også brug for at små-opdatere disse data - i en fart : )
- og forsøger at gøre det i ét hug, med str_replace, f.eks:

$data = str_replace("Mona|@|456", "Mona|@|457", $data)
So far so good

Problemet opstår hvis jeg skal slette et bestemt element... ?
- jeg ved ikke om det er det første, det sidste, ligger midt i eller helt alene...

Nogle gode råd ?
Avatar billede arne_v Ekspert
26. oktober 2009 - 12:41 #1
Jeg tror at best practice er at lave en tabel med 2 felter og en række per konto !

:-)
Avatar billede j4k0b Nybegynder
26. oktober 2009 - 12:45 #2
Enten skal du gøre som arne_v skriver, ellers er det nemmeste nok at bruge serialize() og unserialize()

<?php
$data = array('Mogens' => 123, 'Bent' => -23);
$serialized = serialize($data);

// indsæt $serialized til database her
?>


<?php
// Hent serialized data fra mysql til $serialized her
$data = unserialize($serialized);
?>
Avatar billede Slettet bruger
26. oktober 2009 - 13:31 #3
Undskyld den dårlige forklaring :(
- i har ret begge to, men

Det handler ikke om at gøre det let eller "rigtigt", men hurtigt!
- og jeg driver ikke bank - det var bare et eksempel : )

Det bedste jeg kan komme op med selv er:

if (strpos( $data, $element."|#|") === FALSE)
    if (strpos( $data, "|#|".$element) === FALSE)
        $s = str_replace( $element , "" , $data );          // solo
    else
        $s = str_replace( "|#|".$element , "" , $data );  // sidste
else
    $s = str_replace( $element."|#|" , "" , $data );      // første eller midt i


Og nu hvor jeg har fået tænkt lidt mere over det..
- i langt de fleste tilfælde vil det klares med 1 strpos og 1 str_replace
Og i de tilfælde hvor der skal mere til, vil $data være ganske lille, så pyt.

Det kan sgu nok ikke gøres hurtigere... eller hvad ?
Avatar billede Slettet bruger
26. oktober 2009 - 13:45 #4
Jo, en lillebitte smule:
Sidste element vil oftere skulle slettes end første.
- og så lidt mere debug-venligt formateret:


if (strpos( $data,    "|#|".$element) !== FALSE)
    $s = str_replace("|#|".$element , "" , $data );      // sidste eller midt i
else
    if (strpos( $data,    $element."|#|") !== FALSE)
        $s = str_replace($element."|#|" , "" , $data );  // første
    else
        $s = str_replace( $fra , "" , $data );                  // solo


Tadaaa!
- umuligt at forbedre ?
Avatar billede j4k0b Nybegynder
26. oktober 2009 - 16:47 #5
Well, så lad mig lige sige at str_replace ikke er specielt hurtig. Brug i stedet preg_replace med et regulært udtryk, det vil betale sig mht. performance i forhold til str_replace, især i længden.

Dog er arne_v's forslag stadig den pæneste, og sikkert også den hurtigste løsning. Du skal selvfølgelig huske at have de rigtige INDEXes på din tabel :-)
Avatar billede Slettet bruger
26. oktober 2009 - 19:09 #6
Tillad mig at tvivle..
- Den skal jo udføre det samme "arbejde" PLUS starte reg.exp op OG evaluere mit "expression"

Desuden aner jeg ikke hvad strengene faktisk indeholder - brugerindtastet - kunne godt risikere at "betyde noget" på reg.exp'sk...


Men du har ret i at str_replace er langsom. Det var derfor jeg stillede spørgsmålet...
- Min PHP-erfaring skal måles i uger : )


Men str_ireplace og stripos vil nok være hurtigere - de slipper jo for at sammenligne både store og små bogstaver - ja, sådan må det være : )

NB: Grunden til at jeg ikke vil bruge en dedikeret table/index, er at disse data ALTID bruges samlet - som varerne i en indkøbskurv eller kampene på en tipskuppon...

Altså lige pånær disse små-opdateringer...
Avatar billede dkfire Nybegynder
26. oktober 2009 - 20:25 #7
Jamen selv om de bruges samme hele tiden, så betyder din tabelopbygning alt. Har du ikke en fornuftig tabelstruktur så kommer du ud i flere problemer senere. Og alt hvad du laver nu er kun lappeløsninger på noget der ikke er lavet ordenligt første gang.
Det kan godt være det tager lidt tid for dig nu at ændre din struktur, men jeg er sikker på at du vinder meget i det lange løb.
Avatar billede Slettet bruger
27. oktober 2009 - 01:43 #8
Hmm.. 3 imod 1
- Jeg genovervejer : )
Avatar billede arne_v Ekspert
27. oktober 2009 - 03:12 #9
Avatar billede Slettet bruger
27. oktober 2009 - 09:34 #10
YES - lige hvad jeg havde brug for arne_v
- I won't (yet)

dkfire - du har selvfølgelig ret - men det ER efter "moden" overvejelse, at jeg har samlet disse data.
Avatar billede Slettet bruger
29. oktober 2009 - 00:08 #11
Jeg høster points'ne selv for:

if (stripos( $data,    "|#|".$element) !== FALSE)
    $s = str_ireplace("|#|".$element , "" , $data );      // sidste eller midt i
else
    if (stripos( $data,    $element."|#|") !== FALSE)
        $s = str_ireplace($element."|#|" , "" , $data );  // første
    else
        $s = str_ireplace( $fra , "" , $data );                  // solo


Håber ikke det støder nogen...
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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