
本文讲解如何在调用 api 时确保 json 数据中数字字段(如 stock.value)以整型而非字符串形式输出,核心是使用 intval() 显式转换用户输入,防止 json_encode 自动将数字转为字符串。
在 PHP 构建 API 请求体时,一个常见却容易被忽视的问题是:用户通过表单(如 $_POST['stoc'])提交的值始终是字符串类型。即使输入的是纯数字(例如 200),PHP 也会将其作为字符串 "200" 存储。当该值参与 json_encode() 序列化时,它将被原样输出为 JSON 字符串 "value": "200",而非期望的数字 "value": 200。
要解决这个问题,必须在构建 $payload 数组前,对所有应为数值的字段进行显式类型转换。推荐使用 intval()(适用于整数)或 (float) 强制转换(适用于小数),而非依赖自动类型推断。
以下是你原始代码中关键部分的修正示例:
$payload[] = [
"id" => $id,
"locale" => "RO",
"hidden" => 0,
"currency" => "RON",
"brand" => "Decorepublic",
"name" => $nume,
"category_id" => 10008,
"status" => "1",
"vat" => "0",
"stock" => [[
"warehouse_id" => 1,
"value" => intval($stoc), // ✅ 关键修复:强制转为整数
]],
"sale_price" => floatval($pret), // ✅ 同理,价格建议用 floatval
"rrp" => floatval($rrp),
"description" => $nume,
"images" => array_filter([ // ✅ 建议过滤空 URL,提升健壮性
["url" => $url],
["url" => $url1],
["url" => $url2],
["url" => $url3],
], function($img) { return !empty($img['url']); }),
];⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- intval("200") 返回 200(int),而 intval("200.9") 会截断为 200;若需保留小数,请改用 floatval($stoc) 或 filter_var($stoc, FILTER_VALIDATE_FLOAT);
- 不要使用 (int)$stoc 替代 intval() —— 二者行为基本一致,但 intval() 更语义清晰且支持进制参数(本例无需);
- http_build_query(["data" => json_encode($payload)]) 是可行的,但更规范的做法是直接发送 JSON 格式请求体(设置 Content-Type: application/json 并传入 json_encode($payload)),不过需确认目标 API 是否接受该格式;
- print $stoc 输出 1 是因为 print 返回布尔值(成功返回 1),并非 $stoc 的值——调试请用 var_dump($stoc) 或 echo $stoc;。
总结:JSON 中的数字类型由 PHP 变量的底层类型决定,而非其内容外观。只要确保 $stoc、$pret 等变量在写入 $payload 时已是整型/浮点型,json_encode() 就会生成无引号的原生数值,从而满足 API 对数据格式的严格要求。











