[PHP] Unset resulteert in object met index keys

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • M4RTiN
  • Registratie: Augustus 2000
  • Laatst online: 24-11-2024
Ik heb een JSON string waar ik onder het element objects enkele child's wil verwijderen in PHP, hieronder een voorbeeld van de structuur.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
   "objects":[
      {  "left":0,
         "top":0, },
      { "left":0,
         "top":0,},
      {"left":0,
         "top":0, },
      { "left":0,
         "top":0, }
   ],
   "background":"#FFFFFF",
   "Sc":2.441575,
   "centeredRotation":false
}


Merk op dat alle objecten dus in de square brackets staan. Dit is voor mij erg belangrijk dat dit intact blijft, anders wordt deze data in een andere applicatie niet geaccepteerd.

Eerst heb ik mijn normale manier gebruikt, json_decode met de waarde true aan voor omzetten naar array, maar zodra ik unset gebruik dan wordt de output ongeveer zo:

code:
1
2
3
4
5
6
7
8
9
10
11
{
    "objects":{

         "2":{

         "left":92.28,
         "top":369.12
       }
  }

}


Dus de brackets worden omgezet naar een array met index keys. Vervolgens dacht ik de oplossing gevonden te hebben door een bewerking te doen door het niet naar een array te converten en de unset als volgt te doen:

code:
1
unset($array_data->objects[$counter]);


Hoewel de node wél wordt verwijderd, worden er toch index keys aangemaakt. Bovendien gaat het alléén mis zodra ik unset gebruik. Ik kan dus wel met succes de json decoden naar een object en weer naar een json string encoden, zolang ik maar niet een unset commando gebruik.

Ik ben nu op zoek naar een goede tactiek hoe ik child nodes van node object kan verwijderen en toch dezelfde structuur kan aanhouden, ik ben echter bang dat dit een limiet van PHP is hoe er met array's wordt omgegaan.

Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Kan je niet array_values gebruiken om er weer een mooi array van te maken?

Acties:
  • 0 Henk 'm!

  • M4RTiN
  • Registratie: Augustus 2000
  • Laatst online: 24-11-2024
Ik ben de hele middag al wat aan het zoeken geweest, ik heb op zich hier http://stackoverflow.com/...square-bracket-json-array wel een goede pagina gevonden die enigzins het gedrag uitlegt.

Ik zit nu te overwegen om er alsnog weer een normale array van te maken en vervolgens met de tactiek die wordt aangegeven ( een array() command om een array heen) alsnog een goede json output te maken. Het lijkt me alleen zo onnodig. Maar als het zo moet is het zeker een optie.

Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Die persoon van die stackoverflow-link wil een array hebben om zijn object, dat is volgens mij niet wat jij wil.

Maar met array_values die ik eerder noemde kan je dit doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$json = '{
   "objects":[
      {  "left":1,
         "top":2},
      { "left":3,
         "top":4},
      {"left":5,
         "top":6},
      { "left":7,
         "top":8}
   ],
   "background":"#FFFFFF",
   "Sc":2.441575,
   "centeredRotation":false
}';

$array_data = json_decode($json);

unset($array_data->objects[0]);
unset($array_data->objects[1]);

echo '<pre>';

echo "before:\n";
echo json_encode($array_data);

echo "\n\nafter:\n";
$array_data->objects = array_values($array_data->objects);
echo json_encode($array_data);
        
echo '</pre>';


geeft
before:
{"objects":{"2":{"left":5,"top":6},"3":{"left":7,"top":8}},"background":"#FFFFFF","Sc":2.441575,"centeredRotation":false}

after:
{"objects":[{"left":5,"top":6},{"left":7,"top":8}],"background":"#FFFFFF","Sc":2.441575,"centeredRotation":false}


Dit is toch wat je wilt bereiken? Kan je anders je vraag nog eens uitleggen...

[ Voor 1% gewijzigd door Daos op 22-05-2016 19:38 . Reden: mooier voorbeeld ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Makkelijker is het om array_splice te gebruiken ipv unset.

Acties:
  • 0 Henk 'm!

  • M4RTiN
  • Registratie: Augustus 2000
  • Laatst online: 24-11-2024
Array_values kreeg ik de indruk van dat het alsnog met index keys werkte, dit zal aan mijn onkunde hebben gelegen. Heel erg bedankt Daos, dit werkt perfect op deze manier!

Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
M4RTiN schreef op zondag 22 mei 2016 @ 20:00:
Array_values kreeg ik de indruk van dat het alsnog met index keys werkte, dit zal aan mijn onkunde hebben gelegen. Heel erg bedankt Daos, dit werkt perfect op deze manier!
array_values werkt ook met keys maar zorgt ervoor dat de keys oplopend zijn beginnend bij 0.

Het effect staat ook beschreven in de handleiding bij json_encode:
When encoding an array, if the keys are not a continuous numeric sequence starting from 0, all keys are encoded as strings, and specified explicitly for each key-value pair.
Omdat er met unset een key wordt verwijderd zijn de keys niet meer oplopend.

Developer Accused Of Unreadable Code Refuses To Comment

Pagina: 1