如何在Yii2中验证二维数组。
passenger[0][name] = bell
passenger[0][email] = myemail@test.com
passenger[1][name] = carson123
passenger[1][email] = carson##@test.com
如何验证此数组中的名称和电子邮件
由于
答案 0 :(得分:1)
用于验证二维阵列的最干净的解决方案可能是将其视为模型阵列。因此,每个具有email
和name
数据集的数组都应单独验证。
class Passenger extends ActiveRecord {
public function rules() {
return [
[['email', 'name'], 'required'],
[['email'], 'email'],
];
}
}
class PassengersForm extends Model {
/**
* @var Passenger[]
*/
private $passengersModels = [];
public function loadPassengersData($passengersData) {
$this->passengersModels = [];
foreach ($passengersData as $passengerData) {
$model = new Passenger();
$model->setAttributes($passengerData);
$this->passengersModels[] = $model;
}
return !empty($this->passengers);
}
public function validatePassengers() {
foreach ($this->passengersModels as $passenger) {
if (!$passenger->validate()) {
$this->addErrors($passenger->getErrors());
return false;
}
}
return true;
}
}
在控制器中:
$model = new PassengersForm();
$model->loadPassengersData(\Yii::$app->request->post('passenger', []));
$isValid = $model->validatePassengers();
如果您仅将Passanger
模型用于验证,也可以使用DynamicModel
代替public function rules() {
return [
[['passengers'], 'each', 'rule' => [PassengerDataValidator::class]],
];
}
模型。
或者你可以创建your own validator并将其用于数组的每个元素:
function isRepeating(str) {
var characters = str.split('');
if (characters.length < 2) { return false; }
var characterCounts = characters.reduce(function(carry, char) {
carry[char] = carry[char] ? carry[char] + 1 : 1;
return carry;
}, {});
var counts = Object.values(characterCounts);
return !counts.some(c => c !== counts[0]);
}
console.log(isRepeating("123a123a321a")); // true
console.log(isRepeating("hello")); // false
console.log(isRepeating("racecar")); // false
console.log(isRepeating("raceecar")); // true
您可能还想阅读指南中的Collecting tabular input部分(不幸的是,它仍然不完整)。