Array omzetten in variabelen

Pagina: 1
Acties:

Onderwerpen


  • Torrentus
  • Registratie: April 2009
  • Laatst online: 14:47
Beste Tweakers,

Ik krijg via POST data een lange string aangeleverd, met datavelden gescheiden door '|" symbolen, bijv.;
data1=xxjfdsjs|data2=fdajkfldajklfda|data3=fjdjsksjsks

Met behulp van explode(); zet ik die data in een array, zodat ik met
PHP:
1
echo $data['0'];

als resultaat krijg;
code:
1
data1=xxjfdsjs


Vraag is: Hoe zet ik bovenstaand om in een variable 'data1' met als waarde xxjfdsjs?
Ik heb $$data['0'] geprobeerd, maar dat lijkt niet te werken, als ik dan $data1 echo, krijg ik niets.

  • CB32
  • Registratie: November 2011
  • Nu online
Waarom wil je dat?! Het lijkt mij dat de data in een array houden veel makkelijker werkt... eventueel kun je een array maken als $data['naam'] = 'value'; (dus '$data['data1'] = 'xx'?

  • Torrentus
  • Registratie: April 2009
  • Laatst online: 14:47
CB32 schreef op dinsdag 21 augustus 2012 @ 11:19:
Waarom wil je dat?! Het lijkt mij dat de data in een array houden veel makkelijker werkt... eventueel kun je een array maken als $data['naam'] = 'value'; (dus '$data['data1'] = 'xx'?
Dat is ook een optie inderdaad, en zou het probleem ook oplossen.. :)
Maar hoe verbouw ik de array zodat hij het gedeelte v.d. string voor het '=' teken als key neemt?

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

$data bevat/is dus een array met de strings "data1=xxjfdsjs", "data2=fdajkfldajklfda" en "data3=fjdjsksjsks" en die wil je in eigen variabelen hebben?

Als het "dataN={value}"-gedeelte altijd dat formaat aanhoudt, zou je de index (1, 2, 3, ... N) kunnen extraheren met een regex (iets als "data([0-9]+)=(.*)") en zo $newData[$index] = $value kunnen vullen in een loop.

Je kunt ook de hele key gebruiken, dan explode je per item nogmaals maar dan op het =-teken, waarna je een array met $key en $value kunt vullen, zoals Gamebuster voorstelt.

[ Voor 56% gewijzigd door CodeCaster op 21-08-2012 11:27 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 02-12 19:56
PHP:
1
2
3
4
5
6
7
<?php
$data_hash = array();
foreach($data as $val) {
  $val = explode("=", $val, 1); # die "1" voorkomt als het goed is dat meerdere "=" tekens na de 1e genegeerd worden.
  $data_hash[$val[0]] = $val[1];
}
?>


Lang geen PHP meer geschreven en dit is vast ook niet de netste optie: map vind ik netter, maar weet niet of je daarmee ook keys kunt mappen in PHP.

Andere optie die misschien ook werkt in jouw geval:
PHP:
1
<?php parse_str(str_replace("|", "&", $data), $result); ?>


Houdt er wel rekening mee dat parse_str alle keys ook als variablen aanmaakt en dus een beetje smerig is.
Zie documentatie: http://php.net/manual/en/function.parse-str.php

[ Voor 44% gewijzigd door Gamebuster op 21-08-2012 11:32 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


  • Torrentus
  • Registratie: April 2009
  • Laatst online: 14:47
Helaas is het formaat niet dataN, maar een willekeurige string als key (amount/time/date etc.). Als ik Gamebuster's voorbeeld implementeer krijg ik als ik het goed begrijp dus het volgende?

PHP:
1
2
3
4
5
$dataarray=explode("|", $_POST['Data']);
foreach ($data as $val) {
    $val = explode("=", $val, 1);
    $dataarray[$val[0]] = $val[1]; 
}


Aha, parse_str doet in principe wel precies wat ik wil.. Dan zou je dus het volgende krijgen:
PHP:
1
parse_str(str_replace("|", "&", $_POST['Data']), $dataarray);


Dat ga ik even uitproberen, bedankt! :)

[ Voor 23% gewijzigd door Torrentus op 21-08-2012 11:38 ]


  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 02-12 19:56
Nee. $data in mijn voorbeeld was de variable met daarin het resultaat van explode("|", $_POST['Data']);, zoals deze was in je OP.

edit, na jouw edit:
Ja, je 2e werkt wel. Lees wel even de documentatie van parse_str; hij is een beetje nasty. Ik weet niet wat er precies gebeurt of wat voor bijwerkingen er allemaal kunnen volgen als iemand bijv. "_REQUEST[REMOTE_ADDR]=127.0.0.1" naar je scriptje stuurt, maar het zal me niet verbazen dat-ie vrolijk je globals overschrijft.

Of ga voor die van glashio; Die is veiliger en veel epischer :P

[ Voor 73% gewijzigd door Gamebuster op 21-08-2012 11:45 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 30-11 17:18

glashio

C64 > AMIGA > PC

PHP:
1
$result = preg_match_all('/([^=]+)=([^\|]*)\|?/', $_POST['data'], $m) ? array_combine($m[1], $m[2]) : array();

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


  • Torrentus
  • Registratie: April 2009
  • Laatst online: 14:47
Gamebuster schreef op dinsdag 21 augustus 2012 @ 11:37:
Nee. $data in mijn voorbeeld was de variable met daarin het resultaat van explode("|", $_POST['Data']);, zoals deze was in je OP.

edit, na jouw edit:
Ja, je 2e werkt wel. Lees wel even de documentatie van parse_str; hij is een beetje nasty. Ik weet niet wat er precies gebeurt of wat voor bijwerkingen er allemaal kunnen volgen als iemand bijv. "_REQUEST[REMOTE_ADDR]=127.0.0.1" naar je scriptje stuurt, maar het zal me niet verbazen dat-ie vrolijk je globals overschrijft.

Of ga voor die van glashio; Die is veiliger en veel epischer :P
Gelukkig is de string die ik ontvang als 'veilig' te zien, tenzij de Rabobank een lek heeft, maar dan ben ik niet de enige met een probleem denk ik zo. Ik heb nu parse_str(str_replace("|", "&", $_POST['Data']), $dataarray); succesvol geïmplementeerd. Het doet precies wat ik wilde, bedankt! :)

@glashio, Als ik vanmiddag tijd heb zal ik eens kijken of ik hem snel kan vervangen voor jou optie, ook bedankt! :D

Edit: Al aangepast, werkt perfect, bedankt! O+

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 02-12 18:04

Tux

Torrentus schreef op dinsdag 21 augustus 2012 @ 12:08:
[...]


Gelukkig is de string die ik ontvang als 'veilig' te zien, tenzij de Rabobank een lek heeft, maar dan ben ik niet de enige met een probleem denk ik zo.
Maar als je goed programmeert ben je wel een van de mensen zonder probleem als de Rabobank gekke strings gaat versturen ;)
En wat als iemand jouw script weet aan te roepen en daar strings in begint te gooien?

Regel 1 van het ontwikkelen van applicaties: vertrouw nooit dat externe input altijd veilig is.

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.

Pagina: 1