我已经阅读过这些问题,但没有一个能满足我的需求:
(最新的一个说只是添加硬编码的引号,即['']
,但我不能这样做,我正在调用一个返回数组的函数)
所以这是我的代码(注意问题在于空数组 new Array()
):
function AjaxSend() {
$.ajax({
url: '/json/myurl/',
type: 'POST',
dataType: 'jsonp',
data : { 'tab':new Array() },
context: this,
success: function (data) {
if (data.success) {
console.log('ok');
}
else {
console.log('error');
}
}
});
}
简单呃? 这是我的Php代码:
echo '_POST='.var_export($_POST,true)."\n";
这是结果:
_POST=array (
)
jQuery1710713708313414827_1329923973282(...)
如果我将空数组更改为非空,即:
'tab':new Array({ 't':'u' },{ 'v':'w' })
结果是:
_POST=array (
'tab' =>
array (
0 =>
array (
't' => 'u',
),
1 =>
array (
'v' => 'w',
),
),
)
jQuery1710640656704781577_1329923761425(...)
所以这显然意味着当要发送一个空的Array()时,它会被忽略,并且它不会被添加到POST变量。
我错过了什么吗?
PS:我的jQuery版本来自最新的谷歌CDN,即:
http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
和
http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js
我想要发送数组,即使它是空的(=发送 []
)!
有解决方案吗任何的想法?我已经尝试添加此选项traditional: true
但没有成功。
答案 0 :(得分:19)
问题是你无法真正发送空数组。您是否尝试手动发送空数组?那个uri看起来怎么样(注意这与POST的推理相同)?
/path?arr[]
这会产生这样的$ _GET:
array (
'arr' => array (
0 => ''
)
)
这不是一个空阵列,是吗?它是一个包含空字符串的单个元素的数组。那么jQuery做了什么,我会同意这是处理它的正确方法,就是不要发送任何东西。
这实际上非常简单,您可以检查服务器。只需添加一个额外的检查参数是否存在,即:
$tabs = array();
if(isset($_POST['tab'])) {
$tabs = $_POST['tab'];
}
答案 1 :(得分:0)
尝试
PHP
<?php
// `echo.php`
if (isset($_POST["emptyArray"])) {
function arr() {
$request = $_POST["emptyArray"];
if(is_array($request) && count($request) === 0) {
// do stuff
echo $request;
};
};
arr();
};
JS
$.post("echo.php", {"emptyArray":[]}
, function (data, textStatus, jqxhr) {
if (textStatus === "success" && data.length === 0) {
// do stuff
console.log(data.length === 0 ? new Error("error").message : data);
};
});