You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP构建Discord Webhook数组:移除空值键对求助

解决Discord Webhook API的PHP数组空值问题

核心思路

不要预先创建包含所有可能字段的数组,而是仅当字段存在有效值时,才将其添加到数组中。这种写法从根源上避免空值键的出现,比事后清理更高效可靠。


一、推荐写法:按需构建数组

初始化空数组后,逐个判断表单字段是否有效,有效才加入:

// 初始化空的Webhook数据数组
$webhookData = [];

// 处理基础字段:仅当值非空时添加
if (!empty(trim($_POST['username']))) {
    $webhookData['username'] = trim($_POST['username']);
}
if (!empty(trim($_POST['content']))) {
    $webhookData['content'] = trim($_POST['content']);
}
if (!empty(trim($_POST['avatar_url']))) {
    $webhookData['avatar_url'] = trim($_POST['avatar_url']);
}

// 处理embeds字段(解决{"embeds": ["0"]}问题)
$embeds = [];
// 假设表单提交的embed相关字段为embed_title、embed_description等
$embed = [];
if (!empty(trim($_POST['embed_title']))) {
    $embed['title'] = trim($_POST['embed_title']);
}
if (!empty(trim($_POST['embed_description']))) {
    $embed['description'] = trim($_POST['embed_description']);
}
// 其他embed字段(如color、url等)同理判断添加

// 只有当embed存在有效字段时,才加入embeds数组
if (!empty($embed)) {
    $embeds[] = $embed;
}
// 只有当embeds数组非空时,才添加到主数据中
if (!empty($embeds)) {
    $webhookData['embeds'] = $embeds;
}

// 处理file字段(Discord Webhook的file需要是合法上传文件)
if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) {
    // 这里根据Discord要求处理文件上传逻辑,比如读取文件内容等
    // 示例:$webhookData['file'] = ...;
}

二、事后清理已有数组的方法

如果已经预先创建了全量数组,可通过递归过滤移除空值键:

// 递归过滤嵌套数组中的空字符串、null,保留0、false等合法值
function filterEmptyFields($array) {
    $filtered = [];
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $value = filterEmptyFields($value);
            // 过滤后数组非空才保留
            if (!empty($value)) {
                $filtered[$key] = $value;
            }
        } else {
            // 仅移除严格为空的字符串或null
            if ($value !== '' && $value !== null) {
                $filtered[$key] = $value;
            }
        }
    }
    return $filtered;
}

// 假设$originalData是你之前生成的含空值的数组
$webhookData = filterEmptyFields($originalData);

三、最终JSON编码

处理完数组后,再进行JSON编码,确保格式符合Discord要求:

$jsonPayload = json_encode($webhookData, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);

这样生成的JSON只会包含有有效值的字段,不会出现空值键或多余的{"embeds": ["0"]}内容,能正常被Discord Webhook API解析。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 22:15:28