Avatar billede Slettet bruger
27. november 2011 - 18:22 Der er 17 kommentarer og
1 løsning

Hjælp til session set-funktion (php syntax)

Hej

Jeg er ved at lave en lille handy session-klasse, der lige pt. ser således ud: (se bunden af post).

Mit problem består i, at jeg i min set-metode med $k som array og $v forskellig fra null ikke vil sætte værdien i selve session, men i mit kopi $in. Jeg har bare lige sat det op for at vise hvad jeg vil frem til.

Meningen er at jeg skal kunne få samme effekt ved Session::set(array("a", "b"), "c"); som ved  $_SESSION[a][b] = "c";

Nogle der er mega awesome og kan hjælpe mig her?

På forhånd tak!
Caspar

class Session {

...

    static public function set($k, $v = null) {
        if (is_array($k) and is_null($v)) {
            foreach ($k as $key => $value) {
                self::set($key, $value);
            }
            return;
        } elseif (is_array($k) and !is_null($v)) {
            $in = $_SESSION[self::get_key()];
            foreach ($k as $foo) {
                $in = $in[$k];
            }
            $in = $v;
        } else {
            $_SESSION[self::get_key()][$k] = $v;
        }
    }
   
    static public function get() {
        $args = func_get_args();
        $out = $_SESSION[self::get_key()];
        foreach ($args as $arg) {
            $out = $out[$arg];
        }
        return $out;
    }

...

}
Avatar billede olebole Juniormester
27. november 2011 - 19:16 #1
<ole>

Hvordan ser din metode get_key ud?

/mvh
</bole>
Avatar billede Slettet bruger
27. november 2011 - 20:02 #2
Hej

Den returnerer bare en streng, som ikke ændrer sig. En form for namespace.
Avatar billede olebole Juniormester
27. november 2011 - 20:37 #3
Så forstår jeg ikke din kode. Prøv at skrive hele klassen og et eksempel på den måde, du prøver at bruge den
Avatar billede Slettet bruger
27. november 2011 - 22:41 #4
Du skal ikke fokusere på min get_key(), det er blot fordi der kommer til at køre flere projekter på serveren, og de så adskilles. Men du kan se her: http://pastebin.com/tpdJFddw

Jeg vil gerne komme frem til at jeg fx. i

$_SESSION[project-key][trin1][trin2] = "value";

Kan lave en Rtp_Session::set(array("trin1", "trin2"), "ny_value").

Caspar
Avatar billede olebole Juniormester
27. november 2011 - 22:56 #5
Så når vi frem til, at jeg ikke rigtig forstår, hvad du prøver her:


            $in = $_SESSION[self::get_key()];
            foreach ($k as $foo) {
                $in = $in[$k];
            }
            $in = $v;

Avatar billede Slettet bruger
27. november 2011 - 23:07 #6
Det er også der den er gal, det var nu lidt for at fremvise hvad min hensigt er :-) Som det er nu, vil $in være et kopi af $_SESSION, blot med éen ændring, som er i netop:

// Rtp_Session::set(array("trin1", "trin2", "trin3"), $val);
$in[trin1][trin2][trin3] = $val;

Jeg kunne jo så lave en $_SESSION = $in, men jeg vil hellere ændre direkte i min session, hvis muligt?
Avatar billede olebole Juniormester
27. november 2011 - 23:11 #7
Jeg går udfra, du på en eller anden uoplyst måde har dfineret $_SESSION[project-key] som et array.

Det betyder så, at linjen $in = $in[$k]; prøver at finde $_SESSION[project-key][array('trin1', 'trin2')]. Det giver vist ikke rigtig mening
Avatar billede Slettet bruger
27. november 2011 - 23:25 #8
Korrekt, det er et array. Men den vil da finde $_SESSION[project-key][trin1][trin2] .. ?

// $in er et array
// $arr er et array(trin1, trin2);
foreach ($arr as $foo) {
$in = $in[$foo];
}

// inden første gang: $in
// inden anden gang: $in[trin1]
// inden tredje gang: $in[trin1][trin2]

Men jeg kan vel bare til sidst lave en $_SESSION[project-key] = $in. Det kunne bare være der var en mere elegant metode..
Avatar billede olebole Juniormester
27. november 2011 - 23:34 #9
Måske, men $in = $in[$k]; og $in = $in[$foo]; er under alle omstændigheder to helt forskellige ting  *o)
Avatar billede Slettet bruger
27. november 2011 - 23:39 #10
Hovsa! Det er noget af en typo! Sådan noget kan ske når man udvikler i et miljø hvor man ikke kan teste lige pt. :-)
Avatar billede olebole Juniormester
27. november 2011 - 23:40 #11
Prøv at kikke i din kode. Du prøver at bruge hele det nye array ($k) som key i dit seesion array. Du bruger derimod ikke værdierne $foo til noget
Avatar billede olebole Juniormester
27. november 2011 - 23:41 #12
Hehe ... der krydsede vores beskeder igen, men jeg går udfra, det hjælper på tingene  =)
Avatar billede Slettet bruger
27. november 2011 - 23:57 #13
Hehe, ja. Men mit problem er jo egentlig ikke løst.

Min nuværende set-metode: http://pastebin.com/20tbkPnm

Jeg vil jo gerne have gemt hele min oprindelige $in som session mit session-array. Men! Det løser min nuværende kode jo ikke, den sætter bare session-arrayet til at være lig $in som jo lige er blevet defineret til $v.

Det jeg er ude efter er jo egentlig noget ala:

$_SESSION[project-key][trin-1][trin-2]...[trin-n] = $v;

Kan du følge mig?
Avatar billede olebole Juniormester
28. november 2011 - 00:09 #14
Prøv i stedet at kalde by reference:


            $in = &$_SESSION[self::get_key()];
            foreach ($k as $foo) {
                $in = &$in[$foo];
            }
            $in = $v;

Avatar billede Slettet bruger
28. november 2011 - 00:28 #15
Smart! Vidste ikke man kunne kalde by reference på den måde.. Fantastisk når man lærer noget nyt :)

Det ser ud til at virke - mange tak. Smider du et svar?
Avatar billede olebole Juniormester
28. november 2011 - 00:38 #16
Ja, det er altid enormt givende at lære ... både i betydningen 'to learn' og 'to teach'  *o)

Ellers tak, jeg samler ikke point. Læg selv et svar og accepter det, så tråden lukkes  =)
Avatar billede Slettet bruger
28. november 2011 - 00:43 #17
Enig. Fortsat god mandag :-)
Avatar billede olebole Juniormester
28. november 2011 - 00:46 #18
Tak - og i lige måde  =)
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