class User entends Validate
{
protected $rule = [
'test' => 'checkArray:{"name":"string","year":"interval"}'
];
}
class Validate extends \think\Validate
{
/**
* 验证无序数组
*
* @param array $value 需要验证的数据 例: ["name"=>"李四","year"=>30];
* @param string $role 规则 例: {"name":"string","year":"interval"}
* @param array $data 所有参数
* @return string|true
* @author
*/
public function checkArray(array $value, string $role, array $data)
{
$role = json_decode($role, true);
//将数组键值转换成类型
$data_type = $this->arrayValueToType($value);
//判断数组是否相等
if ($data_type === $role) {
return true;
} else {
return '类型错误';
}
}
/**
* 验证有序数组
*
* @param array $value 需要验证的数据 例: [["name"=>"李四","year"=>30],["name"=>"张三","year"=>28]];
* @param string $role 规则 例: {"name":"string","year":"interval"}
* @param array $data 所有参数
* @return string|true
* @author
*/
public function checkListArray(array $value, string $role, array $data)
{
$role = json_decode($role, true);
foreach ($value as $v) {
//将数组键值转换成类型
$data_type = $this->arrayValueToType($v);
//判断数组是否相等
if ($data_type === $role) {
return true;
} else {
return '类型错误';
}
}
}
/**
* 将数组的键值转为类型名称
*
* @param array $data 要验证的数组
* @return array
* @author
*/
private function arrayValueToType(array $data): array
{
foreach ($data as &$v) {
if (is_array($v)) {
$v = $this->arrayValueToType($v);
} else {
$v = gettype($v);
}
}
unset($v);
return $data;
}
}
最佳答案
