[php]Splitsen van geneste array value

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • -W0kk3L-
  • Registratie: Juni 2002
  • Laatst online: 29-08 09:34
Ik kom er niet meer uit. Ik ben met de volgende multidimensional array bezig:
code:
1
2
3
4
5
6
7
8
9
10
11
Array
(
    [B1] => Array
        (
            [0] => conditie regel 1 OF conditieregel 2 EN conditieregel 3
            [1] => foutboodschap
            [2] => 
        )

    [B2] => Array
        (......


Ik probeer uit deze array de value bij [B1][0] te splitsen en weg te schrijven naar een nieuwe array met losse condities, door de volgende code te gebruiken:
PHP:
1
2
3
4
5
6
$i = 1;
foreach ($aBeslispunt[B1][0] as $value) {
    $aCondities["C$i"] = preg_split('/\s*\b(?:(?:EN|OF)\b\s*)+/i', $value);
    echo "C".$i.": ".$aCondities['C'.$i]."<br>\n";
    $i++;
}


Ik krijg de volgende foutmelding:
code:
1
Warning: Invalid argument supplied for foreach()...

Daarnaast zal waarschijnlijk de opvolgende code ook nog niet correct zijn.
Kan iemand mij verder op weg helpen? Ik zit al een tijdje te knutselen, maar kom er niet uit...

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Waarom wil je splitsen met een regex? Zo te zien wil je gewoon splitsen op 'EN' en 'OF'. Kun je dan niet makkelijker splitsen met http://nl2.php.net/split

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 20:10

Dido

heforshe

Nou ben ik niet zo thuis in php, maar waarom gebruik je een foreach als je maar 1 enkel element wilt hebben?

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • -W0kk3L-
  • Registratie: Juni 2002
  • Laatst online: 29-08 09:34
Woy schreef op zondag 07 juni 2009 @ 14:06:
Waarom wil je splitsen met een regex? Zo te zien wil je gewoon splitsen op 'EN' en 'OF'. Kun je dan niet makkelijker splitsen met http://nl2.php.net/split
Omdat ik dan het risico loop dat ik een conditie met "EN" of "OF" erin (zoals KOPEN of PLOFFEN) ook splits.
En dat wil ik voorkomen.
Dido schreef op zondag 07 juni 2009 @ 14:08:
Nou ben ik niet zo thuis in php, maar waarom gebruik je een foreach als je maar 1 enkel element wilt hebben?
Ik wil uiteindelijk alle elementen uit die ene value weer in een geheel nieuwe array hebben.

[ Voor 68% gewijzigd door -W0kk3L- op 07-06-2009 14:12 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
De functie foreach verwacht een array als invoer en niet een element uit een array. Je moet dus gewoon dit doen:

PHP:
1
$aCondities = preg_split('/\s*\b(?:(?:EN|OF)\b\s*)+/i',$aBeslispunt[B1][0]);


Vervolgens bevat $aCondities een array met de gesplitste waarden.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
-W0kk3L- schreef op zondag 07 juni 2009 @ 14:10:
[...]


Omdat ik dan het risico loop dat ik een conditie met "EN" of "OF" erin (zoals KOPEN of PLOFFEN) ook splits.
En dat wil ik voorkomen.
Dan splits je toch op ' EN ' en ' OF ', inclusief de spaties?

Acties:
  • 0 Henk 'm!

  • -W0kk3L-
  • Registratie: Juni 2002
  • Laatst online: 29-08 09:34
Het probleem zit hem in de foreach statement bij $aBeslispunt[B1][0]. Het moet niet alleen voor B1 uitgevoerd gaan worden, maar ook voor B2, B3 etc. Ik heb nu enkel even hard naar B1 verwezen om te kijken of daar de bron van de fout in zat. Dat bleek dus niet zo te zijn.

[ Voor 29% gewijzigd door -W0kk3L- op 07-06-2009 14:14 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Woy schreef op zondag 07 juni 2009 @ 14:06:
Waarom wil je splitsen met een regex? Zo te zien wil je gewoon splitsen op 'EN' en 'OF'. Kun je dan niet makkelijker splitsen met http://nl2.php.net/split
split() is juist een van de ereg* functies, welke je uberhaupt nooit meer moet gebruiken in nieuwe code (preg* is op alle fronten beter). De functie zonder regex glue pattern is explode(). ;)

{signature}


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Als je over alle B-dingen wil lopen en dan steeds element 0 wil splitsen, dan kun je dat zo doen:

PHP:
1
2
3
foreach ($aBeslispunt as $b) {
  // hier dan de split op $b[0]
}

Acties:
  • 0 Henk 'm!

  • -W0kk3L-
  • Registratie: Juni 2002
  • Laatst online: 29-08 09:34
Yes, that did the trick... thnx!
Het resultaat:
PHP:
1
2
3
4
foreach ($aBeslispunt as $b) { 
    $aCondities["C$i"] = preg_split('/\s*\b(?:(?:EN|OF)\b\s*)+/i',$b[0]); 
    $i++;
}

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Snap je ook waarom?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Voutloos schreef op zondag 07 juni 2009 @ 14:16:
[...]
split() is juist een van de ereg* functies, welke je uberhaupt nooit meer moet gebruiken in nieuwe code (preg* is op alle fronten beter). De functie zonder regex glue pattern is explode(). ;)
Ik had niet goed de text van de functie gelezen, ik bedoelde dan ook http://nl2.php.net/manual/en/function.str-split.php. Mijn punt was meer dat het misschien niet nodig is om regex'es te gebruiken

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • -W0kk3L-
  • Registratie: Juni 2002
  • Laatst online: 29-08 09:34
Ja, ik probeerde in de loop direct te verwijzen naar de value i.p.v. naar de key. Nu selecteer je eerst via de key de juiste value en gaat daarna pas splitsen. Zeg ik het goed?

Overigens dit werkt idd ook:
PHP:
1
2
3
4
5
$i = 1;
foreach ($aBeslispunt as $b) { 
    $aCondities["C$i"] = split(" EN | OF ",$b[0]); 
    $i++;
}


En is misschien nog wel netter...

Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 21:34
Misschien een domme vraag, maar waarom zo'n lange regexp?

Die \s is bv niet nodig, want het begin/eind match je al met \b, de word boundary (geen karakter dus, maar wel de overgang van \w (woord karakter) naar \W (niet woord karakter))

En die \s* als je meerdere EN/OF na elkaar wilt matchen, zal het sowieso \s+ zijn, aangezien er een word boundary moest komen, ENEN matcht ie dan al sowieso niet omdat na de eerste EN geen word boundary komt.

Wat kortere/aangepaste versie:
PHP:
1
2
3
foreach ($aBeslispunt as $b) {  
    $aCondities['C' . $i++] = preg_split('~\b(en|of)\b~i',$b[0]);
}

Eventueel dan nog die \s+ toevoegen. En variabelen horen altijd buiten quoters, dus niet "C$i" maar "C" . $i, als je dan ook nog ' gebruikt in plaats van ", word je ook nog verplicht om variabelen buiten quotes te halen, en die $i en $i++ kon in een keer, als je $i++ doet, doet hij eerst i gebruiken, en daarna met eentje ophogen.

Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 21:34
-W0kk3L- schreef op zondag 07 juni 2009 @ 14:27:
Ja, ik probeerde in de loop direct te verwijzen naar de value i.p.v. naar de key. Nu selecteer je eerst via de key de juiste value en gaat daarna pas splitsen. Zeg ik het goed?
Nee, $aBeslispunt[B1][0] is een string, en geen array, dus kan foreach niet
-W0kk3L- schreef op zondag 07 juni 2009 @ 14:27:
Overigens dit werkt idd ook:
PHP:
1
2
3
4
5
$i = 1;
foreach ($aBeslispunt as $b) { 
    $aCondities["C$i"] = split(" EN | OF ",$b[0]); 
    $i++;
}


En is misschien nog wel netter...
split is zoals al gezegd onderdeel van de ereg* functies, die er in PHP6 uit gaan (dacht ik, kan zijn dat het intussen weer veranderd is) onder andere omdat de preg_* functies sneller zijn.

Ook zal die niet altijd werken, bv. in het geval van "En nog iets", of "iets en" omdat er dan geen spatie voor/na komt.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Woy schreef op zondag 07 juni 2009 @ 14:26:
[...]
Ik had niet goed de text van de functie gelezen, ik bedoelde dan ook http://nl2.php.net/manual/en/function.str-split.php. Mijn punt was meer dat het misschien niet nodig is om regex'es te gebruiken
offtopic:
En nu post je een functie welke op basis van substring lengtes werkt. :z Je bedoelt gewoon explode().
[/basis PHP funcs kennis]

edit:
+1 inzichtvol wat betreft de loze functienaamgeving

[ Voor 6% gewijzigd door Voutloos op 08-06-2009 09:09 ]

{signature}


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Voutloos schreef op zondag 07 juni 2009 @ 15:29:
[...]
offtopic:
En nu post je een functie welke op basis van substring lengtes werkt. :z Je bedoelt gewoon explode().
\[/basis PHP funcs kennis]
offtopic:
die [\basis PHP funcs kennis] had ik idd aan het begin moeten zetten ;). Maar je snapt denk wel wat mijn punt was. Ik zal voortaan wat beter kijken naar welke functie ik link, aangezien de naam bij PHP niet altijd even veel zegt ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1