src/Traits/FieldCollectionCommomMethods.php
protected function collectionValue_CheckValue($v) : array
    {
        $canSet = true;
        $state  = [];
        $cState = "valid";


        // Espera-se que uma coleção seja sempre um array simples.
        if (is_array($v) === false || is_assoc($v) === true) {
            $canSet = false;
            $cState = "error.dm.field.collection.expected.array";
        } else {

            // Para cada valor definido...
            foreach ($v as $i => $vv) {
                if ($vv === undefined) {
                    $canSet     = false;
                    $cState     = "error.dm.field.collection.invalid.member";
                    $state[]    = "error.dm.field.collection.member.not.allow.undefined";
                } elseif ($vv === null) {
                    $canSet     = false;
                    $cState     = "error.dm.field.collection.invalid.member";
                    $state[]    = "error.dm.field.collection.member.not.allow.null";
                } elseif ($vv === "") {
                    $canSet     = false;
                    $cState     = "error.dm.field.collection.invalid.member";
                    $state[]    = "error.dm.field.collection.member.not.allow.empty";
                } else {
                    if ($this->isReference() === true) {
                        $check = $this->modelIndividualValue_CheckValue($vv);
                    } else {
                        $check = $this->individualValue_CheckValue($vv);
                    }
                    
                    $canSet     = ($canSet === true && $check["canSet"] === true);
                    $state[]    = $check["state"];

                    // Existindo na coleção qualquer valor inválido, 
                    // OU,
                    // Tendo indicação de que a coleção não deva poder
                    // ser definida...
                    // Altera o estado da coleção para indicar este estado.
                    if ($check["valid"] === false || $canSet === false) {
                        $cState = "error.dm.field.collection.invalid.member";
                    }
                }
            }


            // Se após os testes com os valores individuais a coleção
            // ainda é considerada possível de ser definida
            // Passa a verificar se a coleção como um todo não quebra
            // alguma das regras definidas para sua constituição
            if ($canSet === true && $cState === "valid") {

                // Se a coleção permite apenas valores únicos e 
                // ela possui mais que 1 valor...
                if ($this->collectionIsDistinct() === true && count($v) > 1) {
                    $cState = $this->collectionCheckDistinct($v);
                }


                // Se a coleção de dados passou em todas as validações até aqui
                // E
                // se ela possui critérios de validação sobre a
                // contagem de seus elementos, efetua estas verificações
                if ($cState === "valid") {
                    $cState = $this->collectionCheckAcceptedCount(count($v));
                }

            }
        }


        return [
            "canSet"    => $canSet,
            "valid"     => ($cState === "valid"),
            "state"     => $state,
            "cState"    => $cState
        ];
    }
protected function collectionValue_CheckValue($v) : array
    {
        $canSet = true;
        $state  = [];
        $cState = "valid";


        // Espera-se que uma coleção seja sempre um array simples.
        if (is_array($v) === false || is_assoc($v) === true) {
            $canSet = false;
            $cState = "error.dm.field.collection.expected.array";
        } else {

            // Para cada valor definido...
            foreach ($v as $i => $vv) {
                if ($vv === undefined) {
                    $canSet     = false;
                    $cState     = "error.dm.field.collection.invalid.member";
                    $state[]    = "error.dm.field.collection.member.not.allow.undefined";
                } elseif ($vv === null) {
                    $canSet     = false;
                    $cState     = "error.dm.field.collection.invalid.member";
                    $state[]    = "error.dm.field.collection.member.not.allow.null";
                } elseif ($vv === "") {
                    $canSet     = false;
                    $cState     = "error.dm.field.collection.invalid.member";
                    $state[]    = "error.dm.field.collection.member.not.allow.empty";
                } else {
                    if ($this->isReference() === true) {
                        $check = $this->modelIndividualValue_CheckValue($vv);
                    } else {
                        $check = $this->individualValue_CheckValue($vv);
                    }
                    
                    $canSet     = ($canSet === true && $check["canSet"] === true);
                    $state[]    = $check["state"];

                    // Existindo na coleção qualquer valor inválido, 
                    // OU,
                    // Tendo indicação de que a coleção não deva poder
                    // ser definida...
                    // Altera o estado da coleção para indicar este estado.
                    if ($check["valid"] === false || $canSet === false) {
                        $cState = "error.dm.field.collection.invalid.member";
                    }
                }
            }


            // Se após os testes com os valores individuais a coleção
            // ainda é considerada possível de ser definida
            // Passa a verificar se a coleção como um todo não quebra
            // alguma das regras definidas para sua constituição
            if ($canSet === true && $cState === "valid") {

                // Se a coleção permite apenas valores únicos e 
                // ela possui mais que 1 valor...
                if ($this->collectionIsDistinct() === true && count($v) > 1) {
                    $cState = $this->collectionCheckDistinct($v);
                }


                // Se a coleção de dados passou em todas as validações até aqui
                // E
                // se ela possui critérios de validação sobre a
                // contagem de seus elementos, efetua estas verificações
                if ($cState === "valid") {
                    $cState = $this->collectionCheckAcceptedCount(count($v));
                }

            }
        }


        return [
            "canSet"    => $canSet,
            "valid"     => ($cState === "valid"),
            "state"     => $state,
            "cState"    => $cState
        ];
    }
Verifica se a coleção e retorna um array com
informações sobre sua validação.

@param       mixed $v
Coleção que será testada.

@return      array

$arr = [
"canSet"    bool            Indica se o valor pode ou não ser definido para o campo.
"valid"     bool            Indica se o valor pode ser aceito por este campo.
"state"     string[]        Código do estado de cada item da validação.
"cState"    string          Código do estado da coleção validada.
]