[PHP] Set array dmv string

Pagina: 1
Acties:
  • 102 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hi,

Ik wil voor de handigheid een session set functie maken, dus bijvoorbeeld:
PHP:
1
session_set('user.data.user_id', 4);


Ooit heb ik daar dit van gemaakt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function session_set( $key_code , $val ) {

    $session = explode( '.' , $key_code );
    
    if (isset($session[2])) {
        $_SESSION[$session[0]][$session[1]][$session[2]] = $val;
    } elseif (isset($session[1])) {
        $_SESSION[$session[0]][$session[1]] = $val;
    } else {
        $_SESSION[$session[0]] = $val;
    }
}


Maar zoals jullie zien is dit niet recursive, je zou niet kunnen doen:
PHP:
1
session_set('user.data.dieper.nogdieper.heeldiep.user_id', 4);

Nou komt het niet zo heel vaak voor dat je sessie zo diep is (bij mij niet iig), maar wil wel de mogelijkheid hebben.

Nou ik dacht ik in een creative bui dit met eval te doen maar dat werkt niet :P

Verduidelijking:
Ik wil dan dus de volgende array setten:
PHP:
1
2
3
4
5
6
7
8
9
array('user' => array(
    'data' => array(
        'dieper' => array(
            'nogdieper' => array(
                'user_id' => 4
            )
        )
    )
)

[ Voor 14% gewijzigd door Verwijderd op 07-06-2007 13:52 ]


Acties:
  • 0 Henk 'm!

  • Pyrus
  • Registratie: November 2001
  • Laatst online: 20-09 21:30

Pyrus

Hardknock life

wat dacht je van:

PHP:
1
$_SESSION['ar1']['ar2']['ar3']['ar4'][]=1234;


?

LinkedIn


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat is toch niet dynamisch en totaal niet wat ik wil of begrijp ik dit verkeerd?

[ Voor 19% gewijzigd door Verwijderd op 07-06-2007 13:44 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Waarom zou je zelf willen gaan indexeren (dat is namelijk wat je ongeveer doet) terwijl je ook gewoon de complete string als key kan gebruiken? Ik weet niet wat implementatie van een array in php is maar dat is vast een redelijk snelle map.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat kan, maar is niet wat ik wil :)
Dan staan alles zeg maar in de root van de session array
Je kan dan niet op een bepaalde diepte loopen oid.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Niet getest, maar zoiets in deze geest moet het zijn:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function session_set( $key_code , $val ) 
{

    $session = explode( '.' , $key_code );

    $P_sess = &$_SESSION;

    $n = count($session);

    for($i = 0; $i < $n - 1; $i++)
    {
        if(isset($P_sess[$session[$i]]))
        {
            $P_sess[$session[$i]] = array();
        }
        $P_sess = &$P_sess[$session[$i]];
    }

    $P_sess[$session[$n]] = $val;
}


misschien moet je voor in de loop body nog een nieuwe variabele gebruiken om het lege array toe te voegen.

[ Voor 12% gewijzigd door Grijze Vos op 07-06-2007 13:54 . Reden: Uitleg staat bij Erkens hieronder ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Wat ik een keer voor iets dergelijks heb gedaan is het volgende, als eerste split ik het "path" zodat ik een array heb met alle losse stukjes. Dan loop je door de stukjes heen, waarna je steeds controleerd of je al een array hebt met die naam, zo niet dan maak je hem aan, en uiteindelijk zodra je bij het laatste item bent dan voeg je die content toe :)

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Dit lost iig je probleem op om dynaisch je array aan te maken:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//array to build
$arr= array();

//nodes to create
$foo = array('a','b','c','d');

$currentNode = &$arr;
foreach($foo as $nodeName) {
    if (!isset($currentNode[$nodeName])) {
        $currentNode[$nodeName] = array();
    }
    $currentNode = &$currentNode[$nodeName];
}

//assign a value to the node
$currentNode = 'test';

//print result
print_r($arr);

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Grijze Vos schreef op donderdag 07 juni 2007 @ 13:51:
Niet getest, maar zoiets in deze geest moet het zijn:

misschien moet je voor in de loop body nog een nieuwe variabele gebruiken om het lege array toe te voegen.
Jaaaa :)
Vielen dank!

Kleine wijziging :Y) :
Grijze Vos schreef op donderdag 07 juni 2007 @ 13:51:

PHP:
1
2
    $P_sess[$session[$n-1]] = $val;
}

[ Voor 25% gewijzigd door Verwijderd op 07-06-2007 14:15 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Grijze Vos schreef op donderdag 07 juni 2007 @ 13:51:
Niet getest, maar zoiets in deze geest moet het zijn:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function session_set( $key_code , $val ) 
{

    $session = explode( '.' , $key_code );

    $P_sess = &$_SESSION;

    $n = count($session);

    for($i = 0; $i < $n - 1; $i++)
    {
        if(isset($P_sess[$session[$i]]))
        {
            $P_sess[$session[$i]] = array();
        }
        $P_sess = &$P_sess[$session[$i]];
    }

    $P_sess[$session[$n]] = $val;
}


misschien moet je voor in de loop body nog een nieuwe variabele gebruiken om het lege array toe te voegen.
Waarom die reference naar $_SESSION? welk idee had je daarachter, want een echt nut heeft het in deze situatie niet afaik, behalve dat het imo de code wat onleesbaarder maakt :)

Acties:
  • 0 Henk 'm!

Verwijderd

Ik kwam tot de volgende oplossing:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function setSession($path, $val)
{
    $pathEls = explode(".",$path);

    $result = &$_SESSION;

    while(count($pathEls) > 0)
    {
        $key = array_shift($pathEls);

        $result[$key] = null;

        $result = &$result[$key];
    }

    $result = $val;
}


Deze code loopt door je explode array en gaat steeds een stapje 'dieper' in de array (door middel van een nieuwe key in de array aan te maken, en vervolgens $result naar die nieuwe key te laten refereren). Doet volgens mij precies wat je wilt :)

Edit: Kut te laat :P, hetzelfde idee als Grijze Vos dus, maar deze is iets korter door gebruikt te maken van php's array functies :>

Edit 2: Kan ik meteen reageren op volgende omdat die ook van toepassing is op mijn ding:
Erkens schreef op donderdag 07 juni 2007 @ 14:00:
[...]

Waarom die reference naar $_SESSION? welk idee had je daarachter, want een echt nut heeft het in deze situatie niet afaik, behalve dat het imo de code wat onleesbaarder maakt :)
Als je refereert kun je mooi een tijdelijke variabele gebruiken om je pad op te bouwen om vervolgens via die variabele de $_SESSION te zetten. Ik weet ook niet hoe je het makkelijker in gedachten hebt?

[ Voor 41% gewijzigd door Verwijderd op 07-06-2007 14:03 ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Verwijderd schreef op donderdag 07 juni 2007 @ 14:00:
Ik kwam tot de volgende oplossing:
[...]
Je vergeet te checken of een (tussenliggende) node al bestaat in het array. Op deze manier overschrijf je alle tussenliggende data...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
ok, eventjes getest nu ik thuis ben, en wat opgeschoond:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function session_set( $key_code , $val )
{

  $session = explode( '.' , $key_code );
  $P_sess = &$_SESSION;

  foreach($session as $s)
  {
    if(!isset($P_sess[$s]))
      $P_sess[$s] = array();
    $P_sess = &$P_sess[$s];
  }

  $P_sess = $val;
}


Erkens:
zonder die reference kun je niet bijhouden waar je in je $_SESSION array zit, tenzij je een dubbele loop bouwt, lijkt me ook niet super netjes.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op donderdag 07 juni 2007 @ 13:44:
Dat is toch niet dynamisch en totaal niet wat ik wil of begrijp ik dit verkeerd?
Je begrijpt het verkeerd.
PHP:
1
session_set('user.data.user_id', 4);

doet hetzelfde als
PHP:
1
$_SESSION['user']['data']['user_id']=4;

Verder ben ik het met mark eens dat ik het maar een ranzig zootje vind met al die geneste array's. Bedenk bijvoorbeeld dat je met een punt notatie simpel de labels aap.noot en aap.noot.mies kunt gebruiken terwijl dat in deze array oplossing er voor zorgt dat je 1 van beide waarden kwijtraakt.

Waarom niet gewoon een class gebruiken? Al was het maar enkel een met alleen properties. Veel duidelijker, minder fout gevoelig en imho ook een stuk netter.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja dat snap ik ook wel :) maar denk dat Pyrus doelde op de blokhaken achteraan.

Verder vind ik dit
PHP:
1
$_SESSION['user']['data']['user_id']

ook niet mooi dus daarom deze functie (hij is deel van een session handler class).
Maar het probleem is met punt notaties dat je niet door een selectie kan heen loopen, wel met geneste arrays.

Verder snap ik je vergelijking met een class en wat properties niet, dat bied toch niet de functionaliteit van een session :)

[ Voor 15% gewijzigd door Verwijderd op 07-06-2007 17:53 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ik denk niet dat Pyrus op de blokhaken doelde, maar goed, daarover kan Pyrus alleen uitsluitsel geven. Wat heeft een object met properties met een sessie te maken? Ik zet de class tegenover de array en zie dat een class veel handiger is. Daarnaast heeft een class als extra functionaliteit dat je logica toe kan voegen. Wil je perse itereren over een stuk? Dan kun je dat mooi in je class implementeren (ik ben trouwens erg benieuwd welke itereerbaare gegevens je allemaal in een sessie op wilt slaan. Een sessie is nu niet echt de plek waar je bergen data in op zou willen gaan slaan)

Ik zou liever gewoon een user object in de sessie zetten. Al dat onoverzichtelijke en foutgevoelige geneuzel met array's wat php-ers altijd doen. Ik snap er niks van.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het is een onderdeel van een framework, het is gewoon een handige functionaliteit. Verder zet ik ook niet veel data in een sessie of heel erg diep, maar wil gewoon dat het KAN via deze functie.

[ Voor 4% gewijzigd door Verwijderd op 07-06-2007 18:44 ]


Acties:
  • 0 Henk 'm!

  • Aham brahmasmi
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021
Janoz schreef op donderdag 07 juni 2007 @ 18:37:
Ik zou liever gewoon een user object in de sessie zetten. Al dat onoverzichtelijke en foutgevoelige geneuzel met array's wat php-ers altijd doen. Ik snap er niks van.
offtopic:
Uit eigen ervaring sprekend (amateur webdeveloper zijnde), zou ik zeggen dat dit soort 'geneuzel' met arrays voorkomt uit PHP leren door zelfstudie, met weinig/geen basiskennis van OOP.
Ik zit zelf ook volop te klooien met arrays omdat er nu eenmaal gemakkelijk veel mee te realiseren is en het weinig abstract is. Ik zou er echter graag vanaf stappen in gevallen waar classes handiger/overzichtelijker zijn. Het kost echter tijd en moeite om geavanceerdere programmeerpraktijken (te beginnen te snappen en) toe te passen... :)
Pagina: 1