Установить ключ ассоциативного массива


Рассмотрим этот массив:

protected $filter = [
    'preco' => 'required;double(1,4)',
    'email' => 'required;email'
];

Шаг, foreach:

protected function bootFilterPost() {

    foreach ($this->filter as $key => $value):
        $this->postRules[$key] = preg_split('/(;)/', $value);
    endforeach;

    var_dump($this->postRules);
}

И у меня есть этот выход:

array(2) {
  ["preco"]=>
  array(2) {
    [0]=>
    string(8) "required"
    [1]=>
    string(11) "double(1,4)"
  }
  ["email"]=>
  array(2) {
    [0]=>
    string(8) "required"
    [1]=>
    string(5) "email"
  }
}

, Но должен выйти, таким образом:

array(2) {
  ["preco"]=>
  array(2) {
    ["required"]=>
    string(8) "true"
    ["double"]=>
    string(11) "1,4"
  }
  ["email"]=>
  array(2) {
    ["required"]=>
    string(8) "true"
    ["email"]=>
    string(5) "true"
  }
}

то есть, нужно, чтобы значения были введены, такие как ключи и данные значение в string ("true") или booleam(true);

Author: Cleber Martins, 2017-10-05

1 answers

Несмотря на то, что не прописываете правила, что все интересовали, так как проверок Laravel достаточно полной и позволяют на многие другие вещи, которые мы не упомянули, таких как, unique, min, max, digits, etc... представляю вам возможное решение.

Это использует вспомогательный массив для сопоставления значений:

private $regras = [
    "required"=>true, 
    "email"=>true
];

Если значение рассматривается при этом массиве сопоставление применяется напрямую, в противном случае пытается увидеть, если значение имеет некоторые разделение по (

double(1,4)

Или разделения :

digits:3

, Сделав их толкование и применение.

Например:

protected function bootFilterPost() {

    foreach ($this->filter as $key => $value):
        $arr = preg_split('/(;)/', $value);

        foreach ($arr as $a): //ver cada regra de validação do campo

            //ver se é um que faz parte do array de regras 
            if (array_key_exists ($a, $this->regras)): 
                $this->postRules[$key][$a] = $this->regras[$a];

            elseif (strpos($a, "(") !== false): //ver se tem (
                $split = explode("(", $a); //dividir pelo (
                $this->postRules[$key][$split[0]] = "(" . $split[1];

            elseif (strpos($a, ":") !== false): //ver se tem :
                $split = explode(":", $a); //dividir pelo :
                $this->postRules[$key][$split[0]] = $split[1]; 

            endif;


        endforeach;
    endforeach;

    var_dump($this->postRules);
}

Пример на Ideone

 1
Author: Isac, 2017-10-05 17:06:14