Goedendag,

Via:
print_r($PrimArr['handtekening']);

krijg ik de onderstaande string welke X en Y coördinaten bevat die ik moet gaan omzetten naar SVG:

[{"x":[99,130,142,144,141,130,114,105,102,116,134,145,148,150,144,135,131,136,152,163,169,170,167,157,142,134,127,129,134,142,151,157,163,165,167,169,179],"y":[126,87,68,57,53,53,59,65,68,69,68,68,70,75,86,94,97,102,107,115,120,125,129,132,131,121,104,86,74,68,64,70,84,99,107,111,110]}]

Er moeten dus uit bovenstaande string 37 (ik heb ze geteld) X en Y coördinaten komen, te beginnen met 99,126.

Ik heb dit uiteraard al geprobeerd om zelf op te lossen. Naar mij idee zou ik deze string moeten kunnen afhandelen als een Array maar dat lukt mij dus niet. Ik heb geprobeerd om van 'x' en 'y' nieuwe arrays te maken maar meer dan het resultaat '[' gaf dit niet.

Ik hoef absoluut geen kant en klaar script maar als iemand mij zou kunnen uitleggen/verklaren hoe ik deze string qua opbouw zou moeten lezen, of dat iemand wellicht de PHP functie kan geven die ik moet gaan bestuderen dan zou ik dat heel fijn vinden.

Overigens; deze string komt uit een oorspronkelijke JSON file die ik middels json_decode($json, TRUE) ; 'behandeld' heb.
Zoiets?
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'stdout');

$input = '[{"x":[99,130,142,144,141,130,114,105,102,116,134,145,148,150,144,135,131,136,152,163,169,170,167,157,142,134,127,129,134,142,151,157,163,165,167,169,179],"y":[126,87,68,57,53,53,59,65,68,69,68,68,70,75,86,94,97,102,107,115,120,125,129,132,131,121,104,86,74,68,64,70,84,99,107,111,110]}]';

$output = array();

// alle input zit in index 0 (door de rechte haken om alle inhoud van $input)
$data = json_decode($input, true);

foreach ($data[0]['x'] as $index => $value) {
    $output[] = array($value, $data[0]['y'][$index]);
}

echo '<pre>'.print_r($output, true).'</pre>';
?>

EDIT: wat toelichting. We bouwen een resultaatarray $output op aan de hand van de binnengekomen JSON-data $input, die omgezet is voor een voor PHP hanteerbaar formaat ($data). Dit array bevat één subarray (op index 0) waarin alle data zit. Dit subarray bevat op zijn beurt weer twee arrays: een array met de x-coordinaten en een array met de y-coordinaten. Als ik het goed begrijp wil je een resultaat-array met x-y coordinaatparen.

We doorlopen het array met x-coordinaten (aanname: het array met y-coordinaten bevat evenveel elementen en de indices (posities) van beide arrays zijn zodanig dat de waarden van eenzelfde index samen een coordinatenpaar vormen).

Elke stap van de foreach-lus bouw ik een coordinatenpaar op in het resultaatarray $output. Het eerste coordinaat is (de waarde van) het x-coordinaat. Voor het y-coordinaat maak ik gebruik van de index (positie) die we op dat moment in het x-coordinaat subarray bekijken, en zoek daarmee het corresponderende y-coordinaat op in het subarray van y-coordinaten.

Na afloop van deze lus bevat $output een lijst van x-y coordinaatparen, die ik nogmaals afdruk, bij wijze van visuele bevestiging.
Precies wat mijn bedoeling was. Alleen snap ik het nog niet helemaal. Had ik dit ook kunnen doen ZONDER json_decode() ?

Ik dacht zelf steeds in de richting van:

print_r($PrimArr['handtekening']['x'][0]);

omdat ik aan een Multidimensional array zat te denken. Maak ik hier een grote denkfout?


Ondertussen wat aantekeningen toegevoegd (zie vorige post). Ik weet niet of dat gaat zonder json_decode(), je input is in ieder geval een string, geen array, dus je zult sowieso op een of andere manier een omzetting naar een array moeten doen, ik neem aan dat je hiervoor geen parser wilt gaan schrijven ;).

Dus waarom niet json_decode()? Je bronmateriaal is JSON, dus json_decode() lijkt mij de makkelijkste en meest rechtstreekse manier.
Hallo Thomas, het bronbestand was inderdaad een veel uitgebreidener JSON bestand. Die had ik door json_decode gehaald. Ik was in de veronderstelling dat je hiermee alle ( ook de subarrays ) kon benaderen. Dat lukt me in elk geval wel met andere subarrays uit hetzelfde JSON bestand.

Omdat ik echter de notatie van de array uit bovengenoemde string niet begreep, kon ik de bijbehorende subarray niet benaderen zoals ik gewend ben.

Maar klopt het als ik denk dat wanneer je een correct JSON bestand met json_decode decodeert, je in principe alle arrays zou moeten kunnen aanroepen zonder nogmaals json_decode te hoeven gebruiken? Dan kan ik het nogmaals zelf proberen met de antwoorden die jij gaf. Op die manier zal ik er het meest van leren en begrijpen.
Maar klopt het als ik denk dat wanneer je een correct JSON bestand met json_decode decodeert, je in principe alle arrays zou moeten kunnen aanroepen zonder nogmaals json_decode te hoeven gebruiken?

Klopt, tenzij er een of andere speciale formattering gebruikt wordt (die dan gedocumenteerd zou moeten zijn). Normaal gesproken zou een eenmalige aanroep van (vertaling met) json_decode() voldoende moeten zijn.

Zorg er wel voor dat je deze met de parameter true aanroept (zoals je al deed) zodat je ook daadwerkelijk een associatief array terugkrijgt.

Je kunt het vertaalde resultaat altijd direct raadplegen via een afdruk op het scherm via var_dump() of print_r().
@Thomas : Na heel veel denk- en probeeruurtjes verder krijg ik jouw code natuurlijk wel werkend maar ik heb het idee dat ik gewoon iets heel simpels helemaal niet begrijp :-) En ik wil het wel gaan begrijpen c.q. leren, dus daarom :

Dit is een gedeelte wat ik met print_r krijg:

[handtekening_ontvanger] => [{"x":[99,130,142,144,141,130,114,105,102,116,134,145,148,150,144,135,131,136,152,163,169,170,167,157,142,134,127,129,134,142,151,157,163,165,167,169,179],"y":[126,87,68,57,53,53,59,65,68,69,68,68,70,75,86,94,97,102,107,115,120,125,129,132,131,121,104,86,74,68,64,70,84,99,107,111,110]}]

Zou de juiste output niet moeten zijn :


[handtekening_ontvanger] => Array
(
[x] => Array
( 99,130,142,144,141,130,114,105,102,116,134,145 )
[y] => Array
( 87,68,57,53,53,59,65,68,69,68,68,70,75,86,94 )
)



Ik volg het niet helemaal, je invoer is een tekst-string met geserialiseerde data in het JSON-formaat.

print_r doet niets anders dan iets in human readable form afdrukken, deze voert zelf geen type-omzettingen uit. Je tekst-string is nog steeds een tekst-string, en heeft geen speciale betekenis voor PHP.

Om deze tekst-string om te zetten naar complexere typen variabelen heb je de vertaalfunctie json_decode(). Deze pakt je JSON-string uit en zet deze om naar arrays/objecten/whatever.

Begrijp je het concept "type variabele" (string, array, boolean, object, resource etc.)?
Sorry, ik ben waarschijnlijk niet zo duidelijk.

Maar goed; In de oorspronkelijke JSON file die ik aanroep met json_decode zitten diverse arrays waarvan enkelen ook weer subarrays bevatten.

Alle (sub)arrays kan ik gewoon aanroepen.

Omdat de value van [handtekening_ontvanger] => tussen square brackets stond nam ik aan dat dit ook een array moest zijn. Zoals een object tussen curly brackets staat. Althans, dat begrijp ik uit de uitleg op o.a. w3schools.com .

Uiteindelijk heb ik met jouw hulp het werkend gekregen maar ik heb daarvoor wel 2 keer json_decode moeten aanroepen. Één keer op de originele JSON file en later nog een tweede keer op de string om daar ook een array van te maken.

In mijn ogen had de maker van de originele JSON file dat dus makkelijker kunnen doen toch? ( dat is geen verwijt naar hem maar een vraag of ik het wel goed begrijp)


Uiteindelijk heb ik met jouw hulp het werkend gekregen maar ik heb daarvoor wel 2 keer json_decode moeten aanroepen. Één keer op de originele JSON file en later nog een tweede keer op de string om daar ook een array van te maken.

Dat zou in beginsel niet nodig moeten zijn.
In mijn ogen had de maker van de originele JSON file dat dus makkelijker kunnen doen toch? ( dat is geen verwijt naar hem maar een vraag of ik het wel goed begrijp)

Daar kan ik niets over zeggen omdat ik niet weet hoe dit oorspronkelijke bestand er verder (inhoudelijk) uit ziet.

Reageren