Eu sou muito novo em matrizes multidimensionais, e isso está me incomodando bastante.
Minha matriz é a seguinte:
$fields = array(
"names" => array(
"type" => "text",
"class" => "name",
"name" => "name",
"text_before" => "name",
"value" => "",
"required" => true,
)
)
Então eu tenho uma função que verifica se essas entradas são preenchidas, se forem necessárias.
function checkForm($fields){
foreach($fields as $field){
if($field['required'] && strlen($_POST[$field['name']]) <= 0){
$fields[$field]['value'] = "Some error";
}
}
return $fields;
}
Agora meu problema é esta linha
$fields[$field]['value'] = "Some error";
Quero alterar o conteúdo da matriz original, pois estou retornando isso, mas como obtenho o nome da matriz atual (nomes neste exemplo) no meu loop foreach?
Respostas:
No PHP, passar por reference (
&
) é ... controverso. Eu recomendo não usá-lo, a menos que você saiba por que precisa e teste os resultados.Eu recomendaria fazer o seguinte:
Então, basicamente, use
$field
quando você precisar dos valores e$fields[$key]
quando precisar alterar os dados.fonte
foreach
deve ser controverso? Não é como se fosse uma chamada de função com efeitos colaterais ocultos ou algo assim.Use
&
:&
passa um valor da matriz como referência e não cria uma nova instância da variável. Portanto, se você alterar a referência, o valor original será alterado.http://php.net/manual/en/language.references.pass.php
Editar 2018
Esta resposta parece ser favorecida por muitas pessoas na internet, e foi por isso que decidi adicionar mais informações e palavras de cautela.
Embora a passagem por referência em
foreach
(ou funções) seja uma solução limpa e curta, para muitos iniciantes, isso pode ser uma armadilha perigosa.Isso pode ser um problema sério quando as variáveis estão sendo reutilizadas no mesmo escopo. Outra questão do SO ilustra bem por que isso pode ser um problema.
A desativação de um registro ou a alteração do valor do hash (a chave) durante a iteração no mesmo loop pode levar a comportamentos potencialmente inesperados no PHP <7. O problema fica ainda mais complicado quando o próprio array é uma referência.
Foreach performance.
Em geral, o PHP prefere passar por valor devido ao recurso de copiar na gravação. Isso significa que internamente o PHP não criará dados duplicados, a menos que sua cópia precise ser alterada. É discutível se a passagem por referência
foreach
ofereceria uma melhoria de desempenho. Como sempre é o caso, você precisa testar seu cenário específico e determinar qual opção usa menos memória e tempo de CPU. Para mais informações, consulte a publicação do SO vinculada abaixo pelo NikiC.Legibilidade do código.
Criar referências em PHP é algo que rapidamente sai do controle. Se você é iniciante e não tem controle total do que está fazendo, é melhor ficar longe de referências. Para obter mais informações sobre o
&
operador, consulte este guia: Referência - O que esse símbolo significa no PHP?Para aqueles que querem aprender mais sobre esta parte da linguagem PHP : Referências sobre PHP explicadas
Uma explicação técnica muito boa do @NikiC sobre a lógica interna dos loops de foreach do PHP:
Como o 'foreach' do PHP realmente funciona?
fonte
unset($value);
após oforeach
colchete, para garantir que a variável por referência não esteja mais disponível após a iteração. 3v4l.org/2V2AQUse
foreach($fields as &$field){
- para que você trabalhe com a matriz original.Aqui está mais sobre a passagem por referência.
fonte
Isto é o que eu sugeriria passar por referência
fonte
$fields
?Tente isto
fonte