Php 将二维javascript数组转换为JSON
我尝试了几种不同的json方法(stringify、toJSON,出于绝望,可能还有一些完全不相关的方法),但似乎不知道如何将其字符串化,以便将其传递给php脚本。我能够创建一个二维数组,它可以表示如下:Php 将二维javascript数组转换为JSON,php,javascript,jquery,arrays,json,Php,Javascript,Jquery,Arrays,Json,我尝试了几种不同的json方法(stringify、toJSON,出于绝望,可能还有一些完全不相关的方法),但似乎不知道如何将其字符串化,以便将其传递给php脚本。我能够创建一个二维数组,它可以表示如下: array( 'image'=>array( 0=>'hello.jpeg', 1=>'goodbye.jpeg', 2=>'etc.jpeg'), 'resume'=>array(
array(
'image'=>array(
0=>'hello.jpeg',
1=>'goodbye.jpeg',
2=>'etc.jpeg'),
'resume'=>array(
0=>'resume.doc'),
'reel'=>array(
0=>'reel.mov')
)
var fileArray = {
'image' : [ 'hello.jpeg',
'goodbye.jpeg',
'etc.jpeg'],
'resume' : [ 'resume.doc' ],
'reel' : [ 'reel.mov' ]
};
当我使用这个函数将数组打印到控制台时,它看起来很好。我试图弄明白如何让它与对象一起工作,因为我认为我读到一些东西说对象已经是JSON友好的了,但由于我对javascript不是非常熟悉,所以我一直在苦苦挣扎
编辑:更多详细信息。。。我的数组的声明(当我让它工作时)是这样的,尽管我可能搞砸了:
var fileArray = [];
fileArray['image'] = [];
fileArray['resume'] = [];
fileArray['reel'] = [];
var type;
var name;
var divs = $("#upload-container").children('div');
$.each(divs, function() {
type = $(this).attr('id');
name = $(this).html();
fileArray[type].push(name);
});
该数组结构的对象在JavaScript中可能如下所示:
var objects =
[
{
'image': [
{ '0': 'hello.jpeg' },
{ '1': 'goodbye.jpeg' },
{ '2': 'etc.jpeg' }
]
},
{
'resume': [
{ '0': 'resume.doc' }
]
},
{
'reel': [
{ '0': 'reel.mov' }
]
}
]
现在您已经有了一个由三个对象组成的数组,每个对象都包含一个属性(image、resume、reveel),这是另一个基本上具有key:value对的对象数组('0':'hello.jpeg'
)。也许您可以简化它,不必费心使用索引:
var objects =
[
{
'image': [ 'hello.jpeg', 'goodbye.jpeg', 'etc.jpeg' ]
},
{
'resume': [ 'resume.doc' ],
},
{
'reel': [ 'reel.mov' ]
}
]
然后您可以使用
JSON.stringify(objects)
传递给您的PHP操作。该数组结构的对象在JavaScript中可能如下所示:
var objects =
[
{
'image': [
{ '0': 'hello.jpeg' },
{ '1': 'goodbye.jpeg' },
{ '2': 'etc.jpeg' }
]
},
{
'resume': [
{ '0': 'resume.doc' }
]
},
{
'reel': [
{ '0': 'reel.mov' }
]
}
]
现在您已经有了一个由三个对象组成的数组,每个对象都包含一个属性(image、resume、reveel),这是另一个基本上具有key:value对的对象数组('0':'hello.jpeg'
)。也许您可以简化它,不必费心使用索引:
var objects =
[
{
'image': [ 'hello.jpeg', 'goodbye.jpeg', 'etc.jpeg' ]
},
{
'resume': [ 'resume.doc' ],
},
{
'reel': [ 'reel.mov' ]
}
]
然后您可以使用
JSON.stringify(objects)
传递给您的PHP操作。PHP端的示例预期输出有一个包含数字数组的关联数组。JavaScript数组具有数字索引:如果希望字符串作为键,请使用普通对象而不是数组,因为JavaScript对象的行为类似于您从PHP想到的关联数组。相应的JavaScript对象应如下所示:
array(
'image'=>array(
0=>'hello.jpeg',
1=>'goodbye.jpeg',
2=>'etc.jpeg'),
'resume'=>array(
0=>'resume.doc'),
'reel'=>array(
0=>'reel.mov')
)
var fileArray = {
'image' : [ 'hello.jpeg',
'goodbye.jpeg',
'etc.jpeg'],
'resume' : [ 'resume.doc' ],
'reel' : [ 'reel.mov' ]
};
在用方括号定义的数组中,暗示了数字索引。请注意,fileArray
是用大括号而不是方括号定义的,因此不是数组(不管名称如何)。如果要一次设置一个属性,这仍然允许您使用fileArray['image']=…
语法:
var fileArray = {}; // an object, not an array
fileArray['image'] = [];
fileArray['resume'] = [];
fileArray['reel'] = [];
请注意,初始声明中的花括号使其成为对象,但仍使用方括号语法访问属性
将
fileArray
定义为带方括号的JavaScript数组的方式仍然允许添加基于字符串的键属性,因为数组是对象,但是JSON stringify例程可能会忽略这些属性,而只序列化数字索引属性。PHP端的示例预期输出有一个包含数字数组的关联数组。JavaScript数组具有数字索引:如果希望字符串作为键,请使用普通对象而不是数组,因为JavaScript对象的行为类似于您从PHP想到的关联数组。相应的JavaScript对象应如下所示:
array(
'image'=>array(
0=>'hello.jpeg',
1=>'goodbye.jpeg',
2=>'etc.jpeg'),
'resume'=>array(
0=>'resume.doc'),
'reel'=>array(
0=>'reel.mov')
)
var fileArray = {
'image' : [ 'hello.jpeg',
'goodbye.jpeg',
'etc.jpeg'],
'resume' : [ 'resume.doc' ],
'reel' : [ 'reel.mov' ]
};
在用方括号定义的数组中,暗示了数字索引。请注意,fileArray
是用大括号而不是方括号定义的,因此不是数组(不管名称如何)。如果要一次设置一个属性,这仍然允许您使用fileArray['image']=…
语法:
var fileArray = {}; // an object, not an array
fileArray['image'] = [];
fileArray['resume'] = [];
fileArray['reel'] = [];
请注意,初始声明中的花括号使其成为对象,但仍使用方括号语法访问属性
将
fileArray
定义为带方括号的JavaScript数组的方式仍然允许添加基于字符串的键属性,因为数组是对象,但是JSON stringify例程可能会忽略这些属性,而只序列化数字索引属性。你确定外部结构是数组吗?我想是的。如果变量名为fileArray,那么每个元素将类似于fileArray['image'][0]、fileArray['image'][1]、fileArray['image'][2]、fileArray['resume'][0]和fileArray['reel'][0]。我这样问是因为通常我们会使用对象,而不是数组。是的,部分问题在于声明对象和混淆语法。我想在php中做的事情的等价物是这样的:foreach($key=>$var){fileArray[$key][]=$var;},其中在“key”分支下分类有多个“vars”。但是。。。JavaScript不是PHP。你确定外部结构是数组吗?我想是的。如果变量名为fileArray,那么每个元素将类似于fileArray['image'][0]、fileArray['image'][1]、fileArray['image'][2]、fileArray['resume'][0]和fileArray['reel'][0]。我这样问是因为通常我们会使用对象,而不是数组。是的,部分问题在于声明对象和混淆语法。我想在php中做的事情的等价物是这样的:foreach($key=>$var){fileArray[$key][]=$var;},其中在“key”分支下分类有多个“vars”。但是。。。JavaScript不是PHP。但是如何动态声明它?push对我来说对对象不起作用。但你不是在推对象,而是在推对象属性中存储的数组。如果你只是将fileArray的初始声明更改为var fileArray={}
,那么你的代码应该可以正常工作。接下来的三行添加属性image
、resume
和reveel
,每个属性都是一个数组。在中。每个循环fileArray[type]
访问其中一个数组,然后fileArray[type].push(名称)
将name值推送到关联的array.yes中,就是这样。伊格纳西奥,谢谢你!但是,这将如何动态声明?推一推对一个机器人不起作用