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

Codeigniter 4中关联数组的键与数组长度验证问题

CodeIgniter 4 中验证JSON数据的解决方案

针对你需要验证的JSON结构,要解决两个核心问题:验证array1的键为数字,以及限制array1最多包含50个键值对,以下是具体实现方案:

核心思路

  1. 对array1本身添加规则:确保它是数组,同时检查元素数量上限。
  2. 通过自定义验证规则(或回调)检查array1的所有键是否为数字。
  3. 保留对array1每个值的数字验证。

实现方式一:使用控制器回调函数

直接在控制器中编写回调函数完成自定义验证:

$validation = \Config\Services::validation();

// 设置完整验证规则
$validation->setRules([
    'field1'   => 'required|max_length[20]',
    'array1'   => 'required|is_array|callback_check_array_keys|callback_check_array_size[50]',
    'array1.*' => 'required|numeric'
]);

if (! $validation->withRequest($this->request)->run()) {
    return $this->failValidationErrors($validation->getErrors());
}

// 回调函数:检查数组键是否为数字
public function check_array_keys($array)
{
    foreach (array_keys($array) as $key) {
        // ctype_digit确保键是正整数,若允许浮点数可改用is_numeric
        if (!ctype_digit($key)) {
            $this->validation->setError('array1', 'array1的键必须为数字');
            return false;
        }
    }
    return true;
}

// 回调函数:检查数组元素数量上限
public function check_array_size($array, $maxSize)
{
    if (count($array) > $maxSize) {
        $this->validation->setError('array1', "array1最多只能包含{$maxSize}个键值对");
        return false;
    }
    return true;
}

实现方式二:全局自定义验证规则(推荐复用)

将自定义规则注册到全局,方便多个控制器复用:

1. 注册自定义规则

修改app/Config/Validation.php,添加自定义规则:

public $ruleSets = [
    \CodeIgniter\Validation\Rules::class,
    \CodeIgniter\Validation\FormatRules::class,
    \CodeIgniter\Validation\FileRules::class,
    \CodeIgniter\Validation\CreditCardRules::class,
];

public $customRules = [
    // 验证数组所有键为数字
    'array_keys_numeric' => function ($array) {
        foreach (array_keys($array) as $key) {
            if (!ctype_digit($key)) {
                return false;
            }
        }
        return true;
    },
    // 验证数组元素数量不超过最大值
    'array_max_size' => function ($array, $max) {
        return count($array) <= (int)$max;
    }
];

2. 添加错误提示(可选)

修改app/Language/zh-CN/Validation.php,添加对应的错误文案:

return [
    // ... 保留原有错误信息
    'array_keys_numeric' => '{field}的键必须为数字',
    'array_max_size'     => '{field}最多只能包含{param}个键值对',
];

3. 使用自定义规则

在控制器中直接调用全局规则:

$validation = \Config\Services::validation();

$validation->setRules([
    'field1'   => 'required|max_length[20]',
    'array1'   => 'required|is_array|array_keys_numeric|array_max_size[50]',
    'array1.*' => 'required|numeric'
]);

if (! $validation->withRequest($this->request)->run()) {
    return $this->failValidationErrors($validation->getErrors());
}

关键说明

  • CI4默认的array1.*规则仅针对数组值验证,无法处理键的验证,因此必须通过自定义规则实现。
  • 使用ctype_digit而非is_numeric可以确保键是纯数字字符串(如"2876"),若允许类似"12.3"的浮点数字符串,可替换为is_numeric。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:38:17