dongnuo4594
dongnuo4594
2014-06-24 17:02

从php中的复杂数组中获取元素名称

已采纳

My php knowledge is not enough to deal with such a complex array. I am geting it in my Zend Framework 2.3 app while form validation, and want to list all errors, not show each in below input field.

This is an array that I got

Array ( 
       [email] => Array ( 
                         [isEmpty] => Value is required and can't be empty 
                         [someElse] => Some other message
                         ) 
       [subject] => Array ( 
                           [stringLengthTooLong] => The input is more than 128 characters long 
                           ) 
       [content] => Array ( 
                           [isEmpty] => Value is required and can't be empty 
                           ) 
       )

and this is what i have tried so far

i know there is something like Key() but is this what i should be using?

I want to get an output

email - Value is required and...
email - Some other message
Subject - THe input is more than...
content - Value is ..

So far i have tried

if(isset($errorsMessages)) {
    while (current($errorsMessages)) {
        echo key($errorsMessages);
        next($errorsMessages);  
    }
}

it works i am getting list email, subject, content. But then i want to read certain sub-arrays. I have tryied

if(isset($errorsMessages)) {
    while ($fruit_name = current($errorsMessages)) {
        echo key($errorsMessages);
            foreach ($errorsMessages as $i) {
                foreach($i as $j) {
                    echo '<br ./>' . ' - ' . $j;
                }
            }
        next($errorsMessages);  
    }
}

but it is a totall mess, i am getting output

email
- Value is required and can't be empty
- The input is more than 128 characters long
- Value is required and can't be empty
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • dongqi9125 dongqi9125 7年前

    I'm using zf2 validation too.

    If you are trying to accomplish a direct way to check the array content, you should try it on hand by yourself.

    A way to easy is to check:

    $validatorMessages //suppost the messages are there.
    
    $messageInline = ''; //suppost to be the message without array
    
    //add validation by yourself to check if validatorMessage was not a empty array, becouse it throw a exception if has 0 itens.
    
    foreach($validatorMessage as $input => $messages)
    {
        if(count($messages)>0)) { //check if really was a first message
    
            foreach($messages as $type => $message) { //Here is the magic!
    
                $messageInline .= sprintf('%s - %s',$input,$message).'<br>'; //setting message and newline.
            }
    //please note that the first param pass to sprintf was Input, from the master array indice, and the message was a subsequent item inside the same input value.
        }
     }
    
    if(strlen($messageInline)>0) {
         echo 'Errors Founds: ' . $messageInline;
         return false;
    } else {
        return true;
    }
    
    点赞 评论 复制链接分享
  • dtihe8614 dtihe8614 7年前

    Assuming that the data is only ever two layers deep you could nest 2 foreach loops like this foreach ($errors => $key1 as $value1) { foreach ($errors => $key2 as $value2) { echo $key1 . " - " . $value2; } }

    点赞 评论 复制链接分享