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
相关产品推荐
相关产品推荐

