当前位置: 首页 > 知识库问答 >
问题:

php - codeigniter4多维数组validation怎么写?

魏成济
2024-08-06

目前想使用codeigniter4框架对下面的数据进行验证

[{"departmentId":100},{"percentage":10,"departmentId":10}]

验证用的代码如下

$validationService->setRules([
    'costDepartment.*.departmentId' => [
        'rules'=>'required|is_natural_no_zero',
        'errors' => [
            'required' => '必须填写',
            'is_natural_no_zero' => '非0值',
        ]
    ],
    'costDepartment.*.percentage' => [
        'rules'=>'required|is_natural_no_zero|less_than_equal_to[100]',
        'errors'=>[
            'required' => '必须填写',
            'is_natural_no_zero' => '非0值',
            'less_than_equal_to' => '值小于等于{param}',
        ]
    ],
]);

目前对于上述组合来说,运行后是不会得到任何错误的,但我希望是costDepartment的每个元素都对departmentId和percentage进行相应的检查,即按照上述测试用例应该会告诉我有percentage是需要填写的,请问这个需要怎么进行修改,谢谢。

共有1个答案

虞修平
2024-08-06

在 CodeIgniter 4 中,直接使用点符号(.)来访问多维数组中的元素进行验证可能不总是按预期工作,尤其是当数组结构不固定(如你的示例中,有的元素有 percentage 而有的没有)时。CodeIgniter 4 的验证规则通常是为单维数组或对象属性设计的。

对于你的特定情况,你可以通过自定义验证规则或使用其他方法来处理。但一个简单且直接的方法是,在验证之前,先确保每个 costDepartment 数组元素都包含所有必要的键。

不过,如果你仍然想通过验证器来尝试处理,你可以考虑以下几个步骤:

  1. 预处理数据:确保每个 costDepartment 数组元素都包含 departmentIdpercentage(即使 percentage 的值为 null0)。
  2. 自定义验证规则:虽然 CodeIgniter 4 的内置规则可能不足以直接处理这种情况,但你可以创建自定义规则来检查数组中的每个元素。

然而,更实用的方法可能是使用 PHP 脚本在验证之前处理数据,确保每个元素都符合一定的结构。这里是一个简化的例子,展示如何在验证前预处理数据:

$data = [
    ["departmentId" => 100],
    ["percentage" => 10, "departmentId" => 10]
];

// 预处理数据,确保每个元素都有 departmentId 和 percentage
foreach ($data as &$item) {
    if (!isset($item['departmentId'])) {
        $item['departmentId'] = null; // 或设置为其他默认值
    }
    if (!isset($item['percentage'])) {
        $item['percentage'] = null; // 或设置为其他默认值,如 0
    }
}

// 现在你可以尝试使用你的验证规则,但请注意,你可能需要调整规则来处理可能的 null 值
$validationService->setRules([
    // ... 你的验证规则 ...
]);

// 验证数据
$validationService->withRequest(service('request'))->run($data);

// 检查是否有错误
if (!$validationService->isValid()) {
    // 处理错误
}

请注意,这个示例没有直接解决你的验证问题,因为它依赖于在验证之前通过预处理来确保数据结构的一致性。如果你需要更复杂的验证逻辑(比如基于 departmentId 的条件验证),你可能需要编写自定义验证规则或使用其他逻辑来增强验证过程。

另外,请注意,less_than_equal_to[100] 规则可能不适用于 null 值,因此你需要确保在验证之前处理这些可能的 null 值,或者在你的自定义验证规则中考虑它们。

 类似资料:
  • 主要内容:实例,实例,三维数组,实例多维数组是包含一个或多个数组的数组。 在多维数组中,主数组中的每一个元素也可以是一个数组,子数组中的每一个元素也可以是一个数组。 一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组,依照这种方式,我们可以创建二维或者三维数组。 二维数组语法格式: 以上数组的元素会自动分配键值,从 0 开始: 实例 <?php // 二维数组: $cars = array ( array ( " Vol

  • ,该数组是一维数组,第一层节点是parent:# 第二层根据第一层id和 第二层parent进行比较,以此类推

  • 接口传参的时候需要给后端传的参数是数组 大概是这样的: 在这弹窗里面,点击弹窗下面的保存按钮调接口,需要把每一行的单位代码和总人口作为参数传过去,还要判断一下id,这条数据有id的话就传id,没有id的话就不传id 只传单位代码和总人口 请问接口传参应该怎么传多维数组,把每一行的单位代码和总人口传给后端,还有判断id应该怎么去操作呢?

  • 问题内容: 我正在开发一个使用数据库类查询mySQL的php应用程序。 该类在这里:http : //net.tutsplus.com/tutorials/php/real-world-oop-with-php-and- mysql/ 我根据自己的需要对课程进行了一些调整,但存在一个问题(可能是一个愚蠢的问题) 使用select()时,它返回一个多维数组,类似于具有3个cols(id,firstn

  • 问题内容: 我有一个数组: 我想使用一个foreach循环来替换(仅允许我设置数字: 能够显示相关数组值的和类 编辑 我希望将数据回显为: 非常感谢您的快速回复。StackOverflow令人震惊! 问题答案:

  • 问题内容: 这是deepbit.net返回给我的比特币矿工的json。我正在尝试访问worker数组并循环进行以打印myemail@gmail.com worker的统计信息。我可以访问Confirmed_reward,hashrate,ipa和payout_history,但是在格式化和输出worker数组时遇到问题。 谢谢您的帮助 :) 问题答案: 我假设您已经解码了使用json_decode

  • 问题内容: 我有一个要在其中搜索并获取数组键的数组。 例子 假设我们有以下二维数组: 函数调用(第一个用户的uid)应返回。 函数调用应返回。 我尝试进行循环,但是我想要更快的执行代码。 问题答案: function searchForId($id, $array) { foreach ($array as $key => $val) { if ($val[‘uid’] === $id) { re

  • 问题内容: 如何比较php中的多维数组?有没有简单的方法? 问题答案: 我知道的最简单的方法是: 请注意,您也可以使用。它们之间的区别是: 使用 Double equals时 ,顺序很重要: 对于 Triple equals ,类型很重要: