/** * 用多组规则断言关联数组的值 * * 每个关联数组的元素均对应一组验证规则,如果这组验证规则不存在,则当成此元素无须验证 * 只有当关联数组的所有元素都通过其对应的组验证规则时,assert_arr() 方法才会返回 true。 * * * 用法: * assert_arr( * array( * 'name' => 'iamsese' , * 'age' => 26 * ), * array( * 'name' => array( * array('not_empty', '用户名不能为空'), * array('min_length', 5, '用户名不能少于 5 个字符'), * array('max_length', 20, '用户名不能超过 20 个字符'), * ) , * * 'age' => array( * array('not_null', '年龄不能为空'), * array('is_int', '年龄必须是整数'), * array('between',18,50,true,'年龄必须是[18,50]的整数'), * ) , * ), * $flds_failed * ); * * * 如果提供了 $flds_failed 参数,则验证失败的规则会存储在 $failed 参数中 * * @param array $row 要验证的关联数组 * @param array $flds_rules 关联数组的键对应的多组规则 * @param mixed $flds_failed 保存验证失败的 字段->错误信息 的关联数组 * @param boolean $withFailedRule 是否保存验证失败的规则信息 * * @return boolean 验证结果 */ public static function assert_arr(array $row, array $flds_rules = null, &$flds_failed = null, $withFailedRule = false) { if (empty($flds_rules)) { return true; } $verify = Verify::getInstance(); if (empty($row)) { $row = array(); } $flds_failed = array(); foreach ($flds_rules as $fld => $rules) { if (empty($rules)) { continue; } if (!isset($row[$fld])) { $row[$fld] = null; } $value = $row[$fld]; $errors = array(); // $fld -> errorInfo foreach ($rules as $index => $rule) { // $rule => array(validation, validationParams, errorInfo) // 无效的规则,则视为true if (empty($rule[0])) { unset($rules[$index]); continue; } if (is_string($rule[0])) { if (method_exists($verify, $rule[0])) { $rule[0] = array(&$verify, $rule[0]); } } $callbackToString = self::str_callback($rule[0]); if (empty($callbackToString)) { unset($rules[$index]); continue; } $rules[$index][0] =& $rule[0]; // 重新补全校验规则 $errors[$callbackToString] = array_pop($rules[$index]); // 弹出错误信息 } $rules_failed = null; // 校验成功 继续下一步 if ($verify->validateBatch($value, $rules, false, $rules_failed)) { continue; } if ($withFailedRule) { $failedRule = self::str_callback(array_pop($rules_failed)); $flds_failed[$fld] = array('fr' => $failedRule, 'ft' => $errors[$failedRule]); } else { $flds_failed[$fld] = $errors[self::str_callback(array_pop($rules_failed))]; } } return empty($flds_failed); }