2013-02-22 11 views
81

Sono molto nuovo negli array multidimensionali e questo mi turba molto.PHP per cambiare i valori degli array originali

mio array è come segue:

$fields = array(
    "names" => array(
     "type"   => "text", 
     "class"  => "name", 
     "name"   => "name", 
     "text_before" => "name", 
     "value"  => "", 
     "required"  => true, 
    ) 
) 

Poi ho ricevuto una funzione controllando se questi ingressi sono riempiti, se richiesti.

function checkForm($fields){ 
    foreach($fields as $field){ 
     if($field['required'] && strlen($_POST[$field['name']]) <= 0){ 
      $fields[$field]['value'] = "Some error"; 
     } 
    } 
    return $fields; 
} 

Ora il mio problema è questa linea

$fields[$field]['value'] = "Some error"; 

voglio cambiare il contenuto della matrice originale, dal momento che sto tornando questo, ma come faccio ad avere il nome della matrice corrente (nomi in questo esempio) nel mio ciclo foreach?

+1

possibile duplicato di [PHP - Modificare oggetto corrente nel ciclo foreach] (http://stackoverflow.com/questions/10121483/php-modify-current -object-in-foreach-loop) – PhoneixS

+0

Non importa quanto tu sia nuovo (o che tu sia) - questo è qualcosa che puoi leggere dalla documentazione PHP: http://php.net/manual/en/control-structures. foreach.php –

risposta

158

In PHP, passing by reference (&) is ... controversial. I recommend not using it unless you know why you need it and test the results.

mi sento di raccomandare nel seguente modo:

foreach ($fields as $key => $field) { 
    if ($field['required'] && strlen($_POST[$field['name']]) <= 0) { 
     $fields[$key]['value'] = "Some error"; 
    } 
} 

Quindi, in pratica utilizzare $field quando si ha bisogno dei valori, e $fields[$key] quando yo hai bisogno di cambiare i dati.

+0

Bello, funziona! Ho provato prima qualcosa del genere, ma suppongo di aver rovinato un posto :) Ora userò il tuo esempio mille volte e non dimenticherò mai! :) – Jeppe

+0

Felice di averlo aiutato. Inoltre, consiglio di leggere l'articolo che ho collegato, e anche la documentazione ufficiale per foreach (http://php.net/manual/ro/control-structures.foreach.php) –

+0

Per me, il tuo link dice il contrario del tuo riassunto di esso. Ogni risposta, tranne la prima, dice che il riferimento è più veloce, e la prima risposta è per * usi non * pratici che in realtà non modificano la matrice. – Noumenon

9

Utilizzare foreach($fields as &$field){ - così si lavorerà con l'array originale.

Here è di più sul passaggio per riferimento.

-3

Prova questa

function checkForm($fields){ 
     foreach($fields as $field){ 
      if($field['required'] && strlen($_POST[$field['name']]) <= 0){ 
       $field['value'] = "Some error"; 
      } 
     } 
     return $field; 
    } 
+3

Non farlo. Posso vedere almeno due cose che non vanno nel tuo codice: l'assegnazione al campo $ non funziona (l'array $ fields non viene mai modificato quando lo fai), e il campo $ return restituisce il campo singolare, non l'array. – Jacob

1
function checkForm(& $fields){ 
    foreach($fields as $field){ 
     if($field['required'] && strlen($_POST[$field['name']]) <= 0){ 
      $fields[$field]['value'] = "Some error"; 
     } 
    } 
    return $fields; 
} 

Questo è quello che vorrei suggerire passaggio per riferimento

+0

Questa tecnica viene utilizzata per modificare il valore della variabile originale. poiché PHP supporta Pass by Value Technique. Abbiamo bisogno di aggiungere il carattere "&" davanti alla variabile per indicare quel valore da passare per riferimento –

Problemi correlati