Bas
Bas

Reputation: 2400

Compare array php foreach loop

I have 2 arrays and i want to create an output array.

Example array requirements for Title and Subtitle field:

Array
(
[title] => Array
    (
        [required] => 1
        [minLength] => 2
        [maxLength] => 50
    )

[subtitle] => Array
    (
        [required] => 1
        [minLength] => 2
        [maxLength] => 55
    )

)

Post array after post s:

Array
(
    [title] => 
    [subtitle] => s
)

Example Output array:

Array
(
[title] => Array
    (
        [0] => this field is required
        [1] => must be longer than 2
    )

[subtitle] => Array
    (            
        [0] => must be longer than 2
    )

)

How can i generate such array by a foreach loop?

This is what i have, but it wont work well. If i leave title blank and subtitle 1 character he gives back 2 times this field is required. It looks like he duplicated.

class Forms_FormValidationFields {

private $_required;
private $_minLength;
private $_maxLength;
private $_alphaNumeric;
public $_errors;

public function __construct($validate, $posts) {

    array_pop($posts);
    $posts = array_slice($posts,1);

    foreach ( $posts as $postName => $postValue) {
        foreach( $validate[$postName] as $key => $ruleValue ){
            $set = 'set'.ucfirst($key);
            $get = 'get'.ucfirst($key);

            $this->$set( $postValue , $ruleValue);
            if( $this->$get() != '' || $this->$get() != NULL) {
                $test[$postName][] .= $this->$get();
            }
        }            
    }

    $this->_errors = $test;
}
public function setValidation(){
    return $this->_errors;
}
public function getRequired() {
    return $this->_required;
}

public function setRequired($value, $ruleValue) {
    if (empty($value) && $ruleValue == TRUE) {
        $this->_required = 'this field is required';
    }
}

public function getMinLength() {
    return $this->_minLength;
}

public function setMinLength($value, $ruleValue) {
    if (strlen($value) < $ruleValue) {
        $this->_minLength = ' must be longer than' . $ruleValue . '';
    }
}

public function getMaxLength() {
    return $this->_maxLength;
}

public function setMaxLength($value, $ruleValue) {
    if (strlen($value) > $ruleValue) {
        $this->_maxLength = 'must be shorter than' . $ruleValue . '';
    }
}

}

Upvotes: 0

Views: 1845

Answers (1)

Jordan Doyle
Jordan Doyle

Reputation: 3026

Here you go:

<?php
    $required = array(
        'This field is not required',
        'This field is required'
    );

    $length = 'Requires more than {less} but less than {more}';

    $needs = array(
        'title' => array(
            'required' => 1,
            'minLength' => 2,
            'maxLength' => 50,
        ),

        'subtitle' => array(
            'required' => 1,
            'minLength' => 2,
            'maxLength' => 55
        )
    );

    $new_needs = array();

    foreach($needs as $key => $value) // Loop over your array
    {
        $new_needs[$key][] = $required[$value['required']];
        $new_needs[$key][] = str_replace(
            array('{more}', '{less}'),
            array($value['maxLength'], $value['minLength']),
            $length
        );
    }

    foreach($_POST as $key => $value)
    {
        if(empty($value)) { echo $new_needs[$key][0]; }

        if(strlen($value) > $needs[$key]['maxLength'] || strlen($value) < $needs[$key]['minLength']) echo $new_needs[$key][1];
    }

Should be pretty self explanatory if you read over it.

Result:

Array
(
    [title] => Array
        (
            [0] => This field is required
            [1] => Requires more than 2 but less than 50
        )

    [subtitle] => Array
        (
            [0] => This field is required
            [1] => Requires more than 2 but less than 55
        )

)

Upvotes: 2

Related Questions