附加代码taken from cakephp bakery,,其中有人上传了有关自定义验证规则的示例。
class Contact extends AppModel
{
var $name = 'Contact';
var $validate = array(
'email' => array(
'identicalFieldValues' => array(
'rule' => array('identicalFieldValues', 'confirm_email' ),
'message' => 'Please re-enter your password twice so that the values match'
)
)
);
function identicalFieldValues( $field=array(), $compare_field=null )
{
foreach( $field as $key => $value ){
$v1 = $value;
$v2 = $this->data[$this->name][ $compare_field ];
if($v1 !== $v2) {
return FALSE;
} else {
continue;
}
}
return TRUE;
}
}
在代码中,这个人用foreach来访问一个他已经知名的数组成员! 据我了解 - 这是浪费资源和做坏事(甚至是奇怪的)。
关于代码还有一件事:
我不明白那里continue
的使用情况。它是一个单场阵列,不是吗?比较应该发生一次,循环结束。
请赐教。
答案 0 :(得分:1)
在代码中,这个人用foreach来访问一个他已经知名的数组成员!据我了解 - 这是浪费资源和做坏事(甚至是奇怪的)。
第一个参数总是一个键上的数组及其值,第二个参数来自对该函数的调用,在一个名为key的块中...所以,你需要的只是发送键而不是需要迭代
代码使用foreach
来遍历$field
,这是一个键值对的数组。这一切都在验证例程调用identicalFieldValues
时启动,并传递两个值 - $field
,这将是一个看起来像这样的数组:
array (
[email] => 'user entered value 1'
)
第二个参数$compare_field
将设置为字符串confirm_email
。
在这种特殊情况下,使用foreach
看起来并不是很有意义,因为您的数组只有一个键值对。但是你必须以这种方式编写代码,因为CakePHP 会将数组传递给方法。
我相信CakePHP之所以这样做是因为数组是传递字段名称及其值的唯一方法。虽然在这种情况下,字段名称(电子邮件)是无关紧要的,但在其他情况下可能需要。
您在这里看到的是使用框架的一个注意事项。大多数情况下,它们会简化您的代码。但有时候你必须编写一些你不会正常编写的代码,这样框架就会很开心。
关于代码还有一件事:我不明白继续在那里使用。它是一个单场阵列,不是吗?比较应该发生一次,循环结束。请赐教。
事实上。由于continue
之后的foreach循环中没有语句,因此也可以省略整个else
块。
这个的简化版本是:
function identicalFieldValues($field=array(), $compare_field=null)
{
foreach ($field as $field) {
$compare = $this->data[$this->name][$compare_field];
if ($field !== $compare) {
return FALSE;
}
}
return TRUE;
}
我同意你的观点,在验证email
字段时,循环只经过一次迭代。,无论字段如何。您仍需要foreach
,因为您正在获取数组。