You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

解决file_get_contents获取JSON转PHP对象数组返回空数组的问题

如何将包含no[]的JSON请求转换为PHP对象数组?

我来帮你分析问题根源,再给出可行的解决方案:

首先,你的核心问题出在前端发送的JSON格式和后端预期不匹配。HTML里的name="no[]"是给传统表单提交(application/x-www-form-urlencoded)设计的——这种场景下PHP会自动把多个选中的checkbox值解析成数组存入$_POST['no']。但如果是发送JSON请求,no[]只是一个普通的键名,不会被自动解析为数组;如果前端没正确收集选中的checkbox值,后端拿到的自然就是空数组。

方案1:修正前端JSON格式(推荐)

先调整前端发送的JSON结构,把选中的checkbox值整理成数组,用no作为键名(去掉[])。举个JS示例:

// 收集所有选中的checkbox值
const selectedValues = Array.from(document.querySelectorAll('input[name="no[]"]:checked'))
  .map(input => input.value);

// 发送JSON请求
fetch('你的PHP文件路径.php', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ no: selectedValues })
});

然后后端PHP就可以轻松处理,转成对象数组:

$requestBody = file_get_contents("php://input");
// 第二个参数设为false,解析为对象而非关联数组
$requestData = json_decode($requestBody);

$objectArray = [];
if ($requestData && isset($requestData->no)) {
    // 把每个值包装成stdClass对象,组成对象数组
    foreach ($requestData->no as $value) {
        $obj = new stdClass();
        $obj->value = $value; // 可根据业务需求定义对象属性
        $objectArray[] = $obj;
    }
} else {
    $objectArray = [];
}

// 输出结果
print_r($objectArray);

方案2:如果前端无法修改,后端适配键名

如果因为某些限制不能修改前端,那后端要针对no[]这个特殊键名处理,但前提是前端确实发送了该键对应的数组值(你可以先通过var_dump($requestBody)查看原始JSON内容,确认键和值是否正确):

$requestBody = file_get_contents("php://input");
$requestData = json_decode($requestBody);

$objectArray = [];
// 对象属性名带特殊字符时,要用花括号包裹访问
if ($requestData && isset($requestData->{'no[]'})) {
    foreach ($requestData->{'no[]'} as $value) {
        $obj = new stdClass();
        $obj->value = $value;
        $objectArray[] = $obj;
    }
} else {
    $objectArray = [];
}

print_r($objectArray);

额外提示

如果你的场景其实是传统表单提交(不是JSON请求),那完全不需要用file_get_contents("php://input"),直接用$_POST['no']就能拿到选中的checkbox数组,再转成对象数组即可:

$objectArray = [];
if (isset($_POST['no']) && is_array($_POST['no'])) {
    foreach ($_POST['no'] as $value) {
        $obj = new stdClass();
        $obj->value = $value;
        $objectArray[] = $obj;
    }
}

print_r($objectArray);

内容的提问来源于stack exchange,提问作者Andy Hui

火山引擎 最新活动