WL_Juelich
WL_Juelich

Reputation: 11

creating an array, convert it to json and pass it to php

I want to fill an array dynamically with javascript, then convert it to a json string and pass it to php to deal with it.
The problem:
When I define the array like -code 1- the output is as expected:

var feld = {
"key1" : "1",
"key2" : "2",
"key3" : "3"
};
for (key in feld) { console.log (key + "= " + feld[key]); }
var jsonString = JSON.stringify(feld);
console.log(jsonString);

OUTPUT:

key1= 1
key2= 2
key3= 3
{"key1":"1","key2":"2","key3":"3"}

If I define the array like -code 2-

var feld = new Array ();
feld["key1"]="1";
feld["key2"]="2";
feld["key3"]="3";
for (key in feld) { console.log (key + "= " + feld[key]); }
var jsonString = JSON.stringify(feld);
console.log(jsonString);

OUTPUT:

key1= 1
key2= 2
key3= 3
[]

which means, that with code -2- there is nothing to pass to php.
what's wrong ?

Upvotes: 1

Views: 67

Answers (4)

lextiz
lextiz

Reputation: 318

In JavaScript you can attach properties to an array, which will not be member of this array. For example:

let array = new Array(); // Creates empty array: []
array[0] = 123; // Inserts a member to array
console.log(array) // Will output: [123]

array["abc"] = 789 // Attaches a property to array

console.log(array) // Will output: [123], no members were added to array
console.log(array.abc) // Will output: 789

This is possible because Array also acts as an object, so it has members (indexed) and also properties (having keys).

Arrays do not have keys (key0,key2,key3,...), only indexes (0,1,2,...). You probably want either a map or an array. The map is created by code you have attached to the question (first section), the array can be created as following:

var feld = new Array ();
feld[0]="1";
feld[1]="2";
feld[2]="3";
var jsonString = JSON.stringify(feld);
console.log(jsonString);

Upvotes: 0

T.J. Crowder
T.J. Crowder

Reputation: 1074385

"-code 1-" is not an array, it's a non-array object. "-code 2-" is an array, but being used as a non-array object. (And the reason you don't see your non-array properties when you stringify it is that since it's an array, JSON.stringify only serializes the array entries, not the non-array properties.)

What's wrong is that if you want an array, you need to create an array:

var feld = ["1", "2", "3"];

But it sounds like you don't want an array, you really do want an object, like in your first example. If you convert that to JSON and send it to your server, use json_decode to decode it into a PHP object where you can access the key1, key2, and key3 properties to get their values.

Upvotes: 2

bluehipy
bluehipy

Reputation: 2294

You are confusing arrays in js with arrays in php. If in php you can define literal keys for an array like this:

<?php 
   $a = array( 'key1' => 1);
   $a['key1] === 1

in js that is the equivalent of an object rather than an array.

Js is more mathematichal , if you like, with the concept of array,

a = [2, 4, 6];

it is just a list of values/ objects each given by a numeric index.

a[1] === 4

Upvotes: 0

Toni Wenzel
Toni Wenzel

Reputation: 2091

You have to objectify your array:

...
feld = Object.assign({}, feld);

var jsonString = JSON.stringify(feld);
...

Upvotes: -1

Related Questions