2013-02-22 13 views
81

私は多次元配列で非常に新しいです。これは大きな時間を駄目にしています。PHP foreachは元の配列の値を変更します

私の配列は以下の通りです:

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

が、私は、彼らが必要な場合には、これらの入力は、で満たされているかどうかをチェックする機能を得ました。

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

は今私の問題は、このライン

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

私はこれを返すおりますので、私は、元の配列の内容を変更したいですが、どのように私は、現在の配列の名前(名前を取得しますこの例では)私のforeachループですか?

+1

可能重複によりパスを提案するであろうものである[PHP - foreachループ内の現在のオブジェクトを変更し(http://stackoverflow.com/questions/10121483/php-modify-current -object-in-foreach-loop) – PhoneixS

+0

あなたがどんなに新しいか(以前とは異なります)、これはPHPのマニュアル(http://php.net/manual/en/control-structures)から読むことができます。 foreach.php –

答えて

158

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

私がやって推薦試してみてください。

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

だから、基本的には値が必要$field、および$fields[$key]使用よあなたはデータを変更する必要があります。

+0

ニース、これは動作します!このようなものを最初に試してみましたが、私はいくつかの場所をねじ込んだと思います:) 今、私はあなたの例を1000回使い、忘れないでしょう! :) – Jeppe

+0

喜んでそれが助けた。また、私はリンクした記事と、foreachの公式ドキュメント(http://php.net/manual/ro/control-structures.foreach.php) –

+0

を読むことをお勧めします。あなたのリンクはあなたのそれの要約。最初の答えはより速いですが、最初の答えは実際に配列を変更しない*非*実用的な使い方です。 – Noumenon

9

foreach($fields as &$field){を使用してください。元の配列を使用するようにしてください。

Hereは参照渡しの詳細です。

77

使用&

foreach($arr as &$value) 
{ 
    $value = $newVal; 
} 

&を基準として配列の値を渡し、変数の新しいインスタンスを作成できません。したがって、参照を変更すると、元の値が変更されます。

http://php.net/manual/en/language.references.pass.php

-3

これは

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

しないでください。あなたのコードに少なくとも2つの問題があることがわかります: $ fieldへの代入は機能しません($ fields配列は決して変更されません)。 とreturn $ fieldは配列ではなく特異なフィールドを返します。 – Jacob

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

これは私の基準

+0

このテクニックは、元の変数の値を変更するために使用されます。 PHPは値渡し手法をサポートしているためです。変数の前に '&'文字を追加して、その値を参照渡しとして宣言する必要があります –