[PHP] Foreach key comparen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 12:46
Ik heb een probleem bij het uitlezen van tags (voor een tagcloud) uit een tweedimensionale array.

Ik gebruik daarvoor een foreach:

PHP:
1
2
3
4
5
6
7
foreach ($aTags as $key => $value) {
    foreach ($value as $subkey => $subvalue) {
        if ($subkey == "tags") {
            echo $subkey;
        }
    }
}


Wat er dus zou moeten gebeuren: als de key van de subarray(?) gelijks is aan "tags" dan wordt de $subkey weergeven (in werkelijkheid gebeurt er wat anders, maar dat is niet relevant). Echter werkt mijn compare niet, $subkey wordt namelijk altijd weergeven, ongeacht of deze gelijk is aan "tags" of niet.

Dit is hoe (een deel van) mijn structuur eruit ziet met print_r:

code:
1
2
3
4
5
    [1] => Array
        (
            [tags] => biography, rotterdam, study, interested, guitar, university, hobbies, about, 
            [0] => biography, rotterdam, study, interested, guitar, university, hobbies, about, 
        )


En dit is de output:

code:
1
tags0tags0tags0tags0tags0tags0Array


Waarom werkt het niet :? Ik ben al heel lang bezig om te dit proberen te fixen, maar niks helpt :'(

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je kan ook gewoon meteen door $value['tags'] loopen hoor. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • Rian
  • Registratie: Januari 2005
  • Laatst online: 21-05 09:42
Wat Voutloos zegt is inderdaad wel waar, maar ik kan me voorstellen dat je misschien binnen de inner loop nog wat meer functionaliteit zou willen hebben.

Enfin, waar het hierop foutgaat is het feit dat je niet strict compared (===). Probeer dat maar eens, dan worden wel alleen de 'tags' key-value pairs gefiltert. Trouwens, ook als je de 0-key verandert in een letter, werkt jouw code ook. Dit is allemaal gerelateerd aan de loosely-typed opzet van php. Jouw code zou er dus zo uit moeten zien om te bereiken wat jij wilt:

PHP:
1
2
3
4
5
6
7
foreach ($aTags as $key => $value) {
    foreach ($value as $subkey => $subvalue) {
        if ($subkey === "tags") {
            echo $subkey;
        }
    }
}

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Moet je dan niet comparen tegenover $key in plaats van $subkey?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

$array = array(
    'test1' => array('foo' => 'val0', 'baz' => 'val1'),
    'test2' => array('foo' => 'val2', 'bat' => 'val3')
);

foreach ($array as $key => $value) {
    foreach ($value as $subkey => $subvalue) {
        if ($key === 'test2') {
            echo $subkey . "\n";
        }
    }
}
Geeft wel:
foo
bat
En dat is wat je wilt, begrijp ik uit je verhaal (je code zegt dus wat anders).

Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 12:46
Rian schreef op zaterdag 28 augustus 2010 @ 13:57:
Enfin, waar het hierop foutgaat is het feit dat je niet strict compared (===). Probeer dat maar eens, dan worden wel alleen de 'tags' key-value pairs gefiltert. Trouwens, ook als je de 0-key verandert in een letter, werkt jouw code ook. Dit is allemaal gerelateerd aan de loosely-typed opzet van php. Jouw code zou er dus zo uit moeten zien om te bereiken wat jij wilt:

PHP:
1
2
3
4
5
6
7
foreach ($aTags as $key => $value) {
    foreach ($value as $subkey => $subvalue) {
        if ($subkey === "tags") {
            echo $subkey;
        }
    }
}
Dat was het zo te zien, thanks :D

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Rian schreef op zaterdag 28 augustus 2010 @ 13:57:
Enfin, waar het hierop foutgaat is het feit dat je niet strict compared (===). Probeer dat maar eens, dan worden wel alleen de 'tags' key-value pairs gefiltert.
Hoewel je gelijk hebt dat dit het probleem is kan het denk ik geen kwaad op te merken dat voor het vergelijken van 2 strings ook speciale functies bestaan: strcmp danwel strcasecmp. Jezelf aanwennen om deze te gebruiken bij het vergelijken van strings voorkomt dit soort problemen in de toekomst :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 12:46
FragFrog schreef op zaterdag 28 augustus 2010 @ 14:23:
[...]

Hoewel je gelijk hebt dat dit het probleem is kan het denk ik geen kwaad op te merken dat voor het vergelijken van 2 strings ook speciale functies bestaan: strcmp danwel strcasecmp. Jezelf aanwennen om deze te gebruiken bij het vergelijken van strings voorkomt dit soort problemen in de toekomst :)
Thanks voor de tip :)

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Waarom heb je uberhaupt zowel 'tags' als '0' met dezelfde inhoud? Als dat niet enkel is omdat je het voorbeeld versimpeld hebt, kan je array uberhaupt met een dimensie of element minder af. :)

{signature}


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 12:46
Voutloos schreef op zaterdag 28 augustus 2010 @ 14:39:
Waarom heb je uberhaupt zowel 'tags' als '0' met dezelfde inhoud? Als dat niet enkel is omdat je het voorbeeld versimpeld hebt, kan je array uberhaupt met een dimensie of element minder af. :)
Dat weet ik eigenlijk ook niet, dit is wat PDO me teruggeeft met fetchAll(). Aangezien 'tags' nooit zal veranderen lijkt het me niet zo'n big issue om gewoon op de key te checken. Maar de array zou inderdaad met een element danwel dimentie minder kunnen.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Wellicht leuk om dan met de parameters van dergelijke fetch functies te spelen, zodat al je queryresultaten een eenvoudiger structuur hebben. :)

{signature}


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 12:46
Hehe, ja ik gebruik nu PDO::FETCH_ASSOC, eigenlijk toch een stuk handiger dan naderhand de resultaten filteren :+
Pagina: 1