Php 获取嵌套数组中的数组键值

Php 获取嵌套数组中的数组键值,php,arrays,oop,pdo,Php,Arrays,Oop,Pdo,我需要获取一个键名为“name”的数组值,但我似乎无法找到它。当用户没有填写字段时,我显示了一个错误,我希望它更加具体。在我的例子中,当我输出一个错误时,页面上说需要填写fname,但在我的脚本中的一个数组中,检查表单中所需的内容,我列出了一个名称,我希望它显示需要填写的名字。我的代码如下 <?php require_once 'Assets/Scripts/Core/Init.php'; if(Input::exists()){ if(Token::check(Input::g

我需要获取一个键名为
“name”
的数组值,但我似乎无法找到它。当用户没有填写字段时,我显示了一个错误,我希望它更加具体。在我的例子中,当我输出一个错误时,页面上说需要填写
fname
,但在我的脚本中的一个数组中,检查表单中所需的内容,我列出了一个名称,我希望它显示
需要填写的名字。我的代码如下

<?php
require_once 'Assets/Scripts/Core/Init.php';

if(Input::exists()){
    if(Token::check(Input::get('token'))){
        $Validate = new Validate();
        $Validation = $Validate->check($_POST, array(
            'fname' => array(
                'name' => 'First Name',
                'required' => true,
                'min' => '2',
                'max' => '16',
                'alpha' => true
            ),
            'lname' => array(
                'name' => 'Last Name',
                'required' => true,
                'min' => '2',
                'max' => '16',
                'alpha' => true
            ),
            'email' => array(
                'name' => 'E-Mail',
                'required' => true,
                'max' => '128',
                'email' => true,
                'unique' => 'users'
            ),
            'password' => array(
                'name' => 'Password',
                'required' => true
            ),
            'pn' => array(
                'name' => 'Phone Number',
                'required' => true,
                'max' => '10',
                'num' => true
            ),
            'student_id' => array(
                'name' => 'School ID',
                'required' => true,
                'max' => '10',
                'num' => true
            )
        ));

        if($Validate->passed()){
            $user = new User();
            $salt = Hash::salt(32);

            try {
                $user->create('users', array(
                    'email' => Input::get('email'),
                    'password' => Hash::make(Input::get('password'), $salt),
                    'salt' => $salt,
                    'fname' => Input::get('fname'),
                    'lname' => Input::get('lname'),
                    'phone' => Input::get('pn'),
                    'student_id' => Input::get('student_id'),
                    'ip' => $_SERVER['REMOTE_ADDR'],
                    'date' => date('Y-m-d H:i:s'),
                    'usergroup' => 1
                ));
            } catch(Exception $e) {
                die($e->getMessage());
            }
        }
        else {
            echo print_r($Validate->errors());
        }
    }
}

您需要将您的
“is required”
部分移出
规则
循环,以便您可以轻松地实际使用它。然后您还可以很容易地引用
“pretty”
名称

只需将
Validate::check
函数更改为:

public function check($data, $items = array()){
    foreach($items as $item => $rules){
        // check required earlier (moved to here)
        if(isset($rules['required']) && $rules['required'] && empty($data[$item])) {
           $this->addError($rules['name'] . " is required");
        }
请注意,我将其更改为使用
$rules['name']
而不是
$item
,因此您得到了
的“pretty”
名称

        foreach($rules as $rule => $rule_value){
            trim($value = $data[$item]);
            $item = escape($item);

            // removed the required check here

            else if(!empty($value)){
                switch($rule){
                    case 'min':
                        if(strlen($value) < $rule_value){
                            $this->addError("{$item} must be a minimum of {$rule_value} characters.");
                        }
                    break;
                    case 'max':
                        if(strlen($value) > $rule_value){
                            $this->addError("{$item} must be a maximum of {$rule_value} characters.");
                        }
                    break;
                    case 'matches':
                        if($value != $data[$rule_value]){
                            $this->addError("{$rule_value} must match {$item}");
                        }
                    break;
                    case 'unique':
                        $check = $this->_db->get($rule_value, array($item, '=', $value));
                        if($check->count()){
                            $this->addError("{$item} already exists.");
                        }
                    break;
                    case 'email':
                        if(!filter_var($value, FILTER_VALIDATE_EMAIL)) {
                            $this->addError("{$item} is not a valid email.");
                        }
                    break;
                    case 'num':
                        if(!is_numeric($value)){
                            $this->addError("{$item} can only contain numbers.");
                        }
                    break;
                    case 'alpha':
                        if(!ctype_alpha($value))
                        {
                            $this->addError("{$item} can only contain letters.");
                        }
                    break;
                }
            }
        }
    }
}
foreach($rules as$rule=>$rule\u值){
修剪($value=$data[$item]);
$item=转义($item);
//在此处删除所需的复选框
如果(!空($value)){
开关($规则){
案例“min”:
if(strlen($value)<$rule\u值){
$this->addError(“{$item}必须至少为{$rule_value}个字符。”);
}
打破
案例“max”:
if(strlen($value)>rule_值){
$this->addError(“{$item}必须最多为{$rule\u value}个字符。”);
}
打破
案例“匹配”:
如果($value!=$data[$rule\u value]){
$this->addError(“{$rule_value}必须匹配{$item}”);
}
打破
“唯一”情况:
$check=$this->\u db->get($rule\u value,array($item,'=',$value));
如果($check->count()){
$this->addError(“{$item}已经存在。”);
}
打破
“电子邮件”案例:
如果(!filter\u var($value,filter\u VALIDATE\u EMAIL)){
$this->addError(“{$item}不是有效的电子邮件。”);
}
打破
案例“num”:
如果(!是数值($value)){
$this->addError(“{$item}只能包含数字。”);
}
打破
案例“阿尔法”:
如果(!ctype_alpha($value))
{
$this->addError(“{$item}只能包含字母。”);
}
打破
}
}
}
}
}

将$item更改为$rules['name']

public function check($data, $items = array()){
    foreach($items as $item => $rules){
        foreach($rules as $rule => $rule_value){
            trim($value = $data[$item]);
            $item = escape($item);

            if($rule === 'required' && empty($value)){
                $this->addError("{$rules['name']} is required");
            }
            else if(!empty($value)){
                switch($rule){
                    case 'min':
                        if(strlen($value) < $rule_value){
                            $this->addError("{$item} must be a minimum of {$rule_value} characters.");
                        }
                    break;
                    case 'max':
                        if(strlen($value) > $rule_value){
                            $this->addError("{$item} must be a maximum of {$rule_value} characters.");
                        }
                    break;
                    case 'matches':
                        if($value != $data[$rule_value]){
                            $this->addError("{$rule_value} must match {$item}");
                        }
                    break;
                    case 'unique':
                        $check = $this->_db->get($rule_value, array($item, '=', $value));
                        if($check->count()){
                            $this->addError("{$item} already exists.");
                        }
                    break;
                    case 'email':
                        if(!filter_var($value, FILTER_VALIDATE_EMAIL)) {
                            $this->addError("{$item} is not a valid email.");
                        }
                    break;
                    case 'num':
                        if(!is_numeric($value)){
                            $this->addError("{$item} can only contain numbers.");
                        }
                    break;
                    case 'alpha':
                        if(!ctype_alpha($value))
                        {
                            $this->addError("{$item} can only contain letters.");
                        }
                    break;
                }
            }
        }
    }
公共函数检查($data,$items=array()){
foreach($items为$item=>$rules){
foreach($rules as$rule=>$rule\u值){
修剪($value=$data[$item]);
$item=转义($item);
如果($rule=='required'&&empty($value)){
$this->addError(“{$rules['name']}是必需的”);
}
如果(!空($value)){
开关($规则){
案例“min”:
if(strlen($value)<$rule\u值){
$this->addError(“{$item}必须至少为{$rule_value}个字符。”);
}
打破
案例“max”:
if(strlen($value)>rule_值){
$this->addError(“{$item}必须最多为{$rule\u value}个字符。”);
}
打破
案例“匹配”:
如果($value!=$data[$rule\u value]){
$this->addError(“{$rule_value}必须匹配{$item}”);
}
打破
“唯一”情况:
$check=$this->\u db->get($rule\u value,array($item,'=',$value));
如果($check->count()){
$this->addError(“{$item}已经存在。”);
}
打破
“电子邮件”案例:
如果(!filter\u var($value,filter\u VALIDATE\u EMAIL)){
$this->addError(“{$item}不是有效的电子邮件。”);
}
打破
案例“num”:
如果(!是数值($value)){
$this->addError(“{$item}只能包含数字。”);
}
打破
案例“阿尔法”:
如果(!ctype_alpha($value))
{
$this->addError(“{$item}只能包含字母。”);
}
打破
}
}
}
}

考虑到你在这里使用了大量的魔法函数,而且还没有费心向我们展示这些函数的源代码……不,我们帮不了你。你应该发布你的
get
method@Tularis它有很多类,但你不需要它们来获取这个值。我想你会使用foreach循环来获取这个值,但我不太确定正确的方法。@EmilioPort我发布了我的验证类您甚至需要一个循环来获取此值感谢您的帮助,但是移动if语句没有任何作用,我看到您在切换2时更改了$item tp$rules['name']。
        foreach($rules as $rule => $rule_value){
            trim($value = $data[$item]);
            $item = escape($item);

            // removed the required check here

            else if(!empty($value)){
                switch($rule){
                    case 'min':
                        if(strlen($value) < $rule_value){
                            $this->addError("{$item} must be a minimum of {$rule_value} characters.");
                        }
                    break;
                    case 'max':
                        if(strlen($value) > $rule_value){
                            $this->addError("{$item} must be a maximum of {$rule_value} characters.");
                        }
                    break;
                    case 'matches':
                        if($value != $data[$rule_value]){
                            $this->addError("{$rule_value} must match {$item}");
                        }
                    break;
                    case 'unique':
                        $check = $this->_db->get($rule_value, array($item, '=', $value));
                        if($check->count()){
                            $this->addError("{$item} already exists.");
                        }
                    break;
                    case 'email':
                        if(!filter_var($value, FILTER_VALIDATE_EMAIL)) {
                            $this->addError("{$item} is not a valid email.");
                        }
                    break;
                    case 'num':
                        if(!is_numeric($value)){
                            $this->addError("{$item} can only contain numbers.");
                        }
                    break;
                    case 'alpha':
                        if(!ctype_alpha($value))
                        {
                            $this->addError("{$item} can only contain letters.");
                        }
                    break;
                }
            }
        }
    }
}
public function check($data, $items = array()){
    foreach($items as $item => $rules){
        foreach($rules as $rule => $rule_value){
            trim($value = $data[$item]);
            $item = escape($item);

            if($rule === 'required' && empty($value)){
                $this->addError("{$rules['name']} is required");
            }
            else if(!empty($value)){
                switch($rule){
                    case 'min':
                        if(strlen($value) < $rule_value){
                            $this->addError("{$item} must be a minimum of {$rule_value} characters.");
                        }
                    break;
                    case 'max':
                        if(strlen($value) > $rule_value){
                            $this->addError("{$item} must be a maximum of {$rule_value} characters.");
                        }
                    break;
                    case 'matches':
                        if($value != $data[$rule_value]){
                            $this->addError("{$rule_value} must match {$item}");
                        }
                    break;
                    case 'unique':
                        $check = $this->_db->get($rule_value, array($item, '=', $value));
                        if($check->count()){
                            $this->addError("{$item} already exists.");
                        }
                    break;
                    case 'email':
                        if(!filter_var($value, FILTER_VALIDATE_EMAIL)) {
                            $this->addError("{$item} is not a valid email.");
                        }
                    break;
                    case 'num':
                        if(!is_numeric($value)){
                            $this->addError("{$item} can only contain numbers.");
                        }
                    break;
                    case 'alpha':
                        if(!ctype_alpha($value))
                        {
                            $this->addError("{$item} can only contain letters.");
                        }
                    break;
                }
            }
        }
    }