[PHP]Variabele variabele uit multidimensionale array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een klasse die aan de hand van een aantal variabelen automatisch een sorteerbare en gepagineerde html tabel weergeeft.

De basics zijn me al gelukt, er wordt een tabel weergegeven en bij het klikken op de headers sorteert ie in de goede volgorde. Ik kan in de array die een veld definieert een prefix en suffix opgeven zodat ik informatie toe kan voegen aan de tabel. Zo zorgt de prefix in de configuratie hieronder ervoor, dat er voor elk bedrag een euro teken komt:
PHP:
1
2
3
4
5
$velden[] = array('Fieldname' => 'Bedrag',
   'Tablename' => 'transacties',
   'THName' => 'Bedrag',
   'Prefix' => '€ ',
   'Datatype' => 'double');

Nu is het vaak het geval dat je bij het klikken op een bepaald veld, de details wilt kunnen zien. Hiervoor moet ik in de link een variabele uit de array (meestal de ID) kunnen opnemen.

Ik dacht dat het handig zou zijn om de variabele naam tussen % tekens in de zetten zoals ik in de configuratie hieronder heb gedaan:
PHP:
1
2
3
4
5
6
$velden[] = array('Fieldname' => 'Naam',
   'FieldDbName' => 'CONCAT(Achternaam, \', \', Voornaam, \' \', Tussenvoegsel)',
   'THName' => 'Naam',
   'Datatype' => 'string',
   'Prefix' => '<a href="klantenadministratie/%KlantID%" />',
   'Suffix' => '</a>');

Nu voelen jullie de bui misschien al hangen, %KlantID% moet vervangen worden door de waarde van die bepaalde row en dan het klantID veld.
Met onderstaande code wordt gekeken of de prefix en suffix geset zijn, als dit het geval is wordt de functie "prepare($string)" aangeroepen die met een regex de string evalueert en %WAARDE% vervangt door $row[$field['WAARDE']]
PHP:
1
2
3
$prefix = array_key_exists('Prefix', $field) ? $this->prepare($field['Prefix']) : '';
$suffix = array_key_exists('Suffix', $field) ? $this->prepare($field['Suffix']) : '';
$table .= "    <td>" . $prefix . $row[$field['Fieldname']] . $suffix . "</td> \n";

en in de prepare functie:
PHP:
1
$string = preg_replace('/([^%])%([A-Za-z0-9]*)%([^%])/', '$1$row[Field[\'$2\']]$3', $string);

Dit returnt heel mooi:
<a href="klantenadministratie/$row[Field['KlantID']]" />
Maar php moet het stukje $row[Field['KlantID']] nog vervangen door de daadwerkelijke KlantID.

Ik heb wat geprobeerd met de functie eval(), maar vind dit nooit echt een mooie oplossing en ik krijg daar ook foutmeldingen bij... Verder heb ik geprobeerd de variabelen met extract() om te zetten naar simpelere variabelen, maar dat gaf ook niet het gewenste resultaat... Nou kan het dat een combinatie van het bovenstaande wel werkt, maar ik heb het gevoel dat ik in een loop aan het testen ben en kom er even niet meer uit...

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Probeer:
PHP:
1
$string = preg_replace('/([^%])%([A-Za-z0-9]*)%([^%])/', "$1$row[Field[\'$2\']]$3", $string);

Content in single quotes wordt niet geparsed, maar behandeld als string.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat heb ik al geprobeerd, maar dan krijg ik een error:
Parse error: parse error, expecting `']''

Bovendien moet binnen die functie de variabele nog niet geparsed te worden omdat daar de variabele niet bestaat... Of moet ik de array aan de functie prepare meegeven? Misschien dat dat werkt, ik ga het proberen, maar eigenlijk wil ik het in de functie waar de tabel wordt gemaakt oplossen...

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Je parse error is in dit geval een typfout in je regex. "$row[Field[\'$2\']]" is namelijk niks. $row[] is een array, dat klant. Field[\'$2\'] is een ongeldig item.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wat MueR zegt is niet helemaal waar, ik zit in een multidimensionale array waarbij binnen de $row een array $field bestaat. zo selecteer ik ook probleemloos $row[$field['Fieldname']].

Maar het klopte inderdaad niet helemaal want ik moet $row['KlantID'] hebben.
Maar als ik die problemen aanpak blijf ik met hetzelfde probleem zitten.
PHP:
1
$string = preg_replace('/([^%]*)%([A-Za-z0-9]*)%([^%]*)/', '$1' . '$row[\'$2\']' . '$3', $string);
Dit lost niks op (returnt <a href="klantenadministratie/$row['KlantID']" />) en als ik het weer tussen dubbele quotes zet krijg ik weer een error:
Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING'

Als het in de prepare functie zou moeten, dan hou ik ongeveer hetzelfde probleem...
PHP:
1
2
3
4
5
6
function prepare($string, $array)
{
    extract($array);
    $string = preg_replace('/([^%]*)%([A-Za-z0-9]*)%([^%]*)/', '$1' . "$$2" . '$3', $string);
    return $string;
}


De string ziet er uit als: <a href="klantenadministratie/$KlantID" />
Met "extract($array)" heb ik de variabele $KlantID binnen de functie beschikbaar, maar hij wordt nog niet geparsed... het begint nu wel erg op variabele variabele te lijken, maar zodra ik aan de slag ga met brackets ( ${$2} ) krijg ik weer parse errors! (Parse error: parse error, expecting `T_VARIABLE' or `'$'')

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Je leest niet goed. Ik zeg dat je parse error een typfout is. Parse errors zijn bijna altijd typfouten.

Zo had je deze:
PHP:
1
2
3
4
// Fout
$row[Field['$2']];
// Goed
$row[ $field['$2'] ];

Je maakt gebruik van de extract functie. Zoals in de docs over deze functie te lezen is, worden alle waarden in een array opgeslagen in een variabele overeenkomstig met hun key.
PHP:
1
2
3
4
5
6
7
8
// de array
$array = ("hello"=>"world",
"foo"=>"bar");
explode($array);
// nu even echoen
echo ($hello . " " . $foo);
// geeft als output:
world bar

Ik zie je nergens in je code gebruik maken van deze variabelen?

Verder zou ik eens proberen je return variabele alvast te laten maken voordat je hem met in de preg_replace doet. Voeg ook eens een paar breakpoints in.

[ Voor 14% gewijzigd door MueR op 07-05-2005 13:03 ]

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jup dat was inderdaad een typo, maar die had helaas niets te maken met het probleem...
Ik ben bekend met wat de extract-functie doet. Deze gebruik ik omdat $KlantID misschien eerder geparsed wordt dan $row['KlantID']. Ik gebruik deze variabele niet direct, maar laat deze maken aan de hand van de variabele die van buiten de class komt. (zie eerste post: ik wil van %KlantID% vervangen door de waarde van $row['KlantID'] (of na het extracten: $KlantID))

Als ik de functie prepare later uitvoer (over de hele rij bijvoorbeeld) maakt het geen verschil...
Misschien een andere vraag:
Hoe kan ik er voor zorgen dat een variabele in een string geparsed wordt?
bijvoorbeeld:
PHP:
1
2
3
$var = '2 plus 2 = $antwoord'; // bewust single quotes om het toepasbaar te maken op mijn probleem
$antwoord = 4;
echo $var; // geeft "2 plus 2 = $antwoord" in plaats van " 2 plus 2 = 4" 

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Verwijderd schreef op zaterdag 07 mei 2005 @ 13:35:
Hoe kan ik er voor zorgen dat een variabele in een string geparsed wordt?
bijvoorbeeld:
PHP:
1
2
3
4
5
6
7
8
$var = '2 plus 2 = $antwoord'; // bewust single quotes om het toepasbaar te maken op mijn probleem
$antwoord = 4;
echo $var; // geeft "2 plus 2 = $antwoord" in plaats van " 2 plus 2 = 4"

//Nou zo dus:
$var = '2 plus 2 = '; // bewust single quotes om het toepasbaar te maken op mijn probleem
$antwoord = 4;
echo $var.$antwoord; // geeft " 2 plus 2 = 4"

[ Voor 10% gewijzigd door MueR op 07-05-2005 13:41 ]

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja dat snap ik, maar je kan niks aan $var veranderen in mijn geval...

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Maar je kan ook niet verwachten dat een string, tussen single quotes (welke standaard niet geparsed wordt), een variabele kan bevatten, welke pas later wordt geset. Als de string al geparsed zou worden, zou je een lege plek krijgen.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Kijk eens naar preg_replace_callback(). :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ah kijk, nu komen we ergens :-)
ik heb nu:
PHP:
196
197
198
199
200
201
202
203
204
205
206
    function prepare($string, $array)
    {
        $string = preg_replace_callback('/([^%]*)%([A-Za-z0-9]*)%([^%]*)/',  array(&$this, 'update'), $string); // array omdat de functie in een klasse zit
        // preg_replace('/([^%]*)%([A-Za-z0-9]*)%([^%]*)/', '$1' . "$$2" . '$3', $string);
        return $string;
    }
    function update($matches)
    {
        return $matches[1].$$matches[2].$matches[3];
        
    }
En dit geeft een Undefined variable: KlantID op regel 204 dus hij wordt nu geparsed, maar de variabele is niet bekend op dat punt in het script. Kan ik extra parameters meegeven aan de functie die preg_replace_callback aanroept?

Ik kan er bij de php documentatie niets over vinden, maar iemand anders verwijst wel naar de /e modifier....

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je zit in een klasse. Kun je dan geen attribuut gebruiken? $this->KlantID ofzo?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nee helaas, de KlantID verschilt per rij (of eigenlijk is zelfs de variabele KlantID variabel) dus ik kan 'm niet uit de attributen halen...

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Het kan wel. :) Mooi is het niet, maar je zou per rij gewoon een attribuut, currentKlantID bijvoorbeeld, kunnen updaten, en dat in die functie gebruiken. Het is smerig, maar voor zover ik weet kan het niet echt anders. Er staan wel wat voorbeelden onder in de user notes van preg_replace_callback die je vertellen dat het met preg_replace wel kan, maar die voorbeelden zijn brak en werken volgens mij niet eens. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Opgelost!
De relevante stukken code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* function to update the matches in preg_replace_callback
* @see function getTable
* @param array $matches The array with the matches
* @return string the parsed string.
*/
function update($matches)
{
    return $matches[1].$this->currentRow[$matches[2]].$matches[3];
}
// in de getTable functie:
while($row = $Result->getNext()){
    // zet $row in tempvar
    $this->currentRow = $row;
    $table .= "  <tr>\n";
    foreach ($this->fields AS $field){
        $prefix = array_key_exists('Prefix', $field) ? preg_replace_callback('/([^%]*)%([A-Za-z0-9]*)%([^%]*)/',  array(&$this, 'update'), $field['Prefix']) : '';
        $suffix = array_key_exists('Suffix', $field) ? preg_replace_callback('/([^%]*)%([A-Za-z0-9]*)%([^%]*)/',  array(&$this, 'update'), $field['Suffix']) : '';
        $table .= "    <td>" . $prefix . $row[$field['Fieldname']] . $suffix . "</td> \n";  
    }
    $table .= "  </tr>\n";
}

Ik heb een nieuwe variabele aangemaakt $currentRow waar ik elke keer de waarden van de huidige row opsla. die vraag ik dan weer op in de functie update en zo krijg ik de juiste link!
Thanks -NME- (en Jurgen via msn :-))
Pagina: 1