171

私は多次元配列に非常に慣れていません。これは私を大いに悩ませています。

私の配列は次のとおりです。

$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 ループで現在の配列の名前 (この例では名前) を取得するにはどうすればよいですか?

4

5 に答える 5

309

PHP では、参照渡し ( &) は ... 議論の余地があります。必要な理由を理解して結果をテストしない限り、使用しないことをお勧めします。

次のことをお勧めします。

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

したがって、基本的$fieldには、値が必要な場合と$fields[$key]、データを変更する必要がある場合に使用します。

于 2013-02-22T12:51:30.760 に答える
206

使用&:

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

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

参照渡しに関する PHP ドキュメント

編集 2018

この回答は、インターネット上で多くの人に好まれているようです。そのため、より多くの情報と注意事項を追加することにしました。
(または関数)での参照渡しforeachはクリーンで短い解決策ですが、多くの初心者にとってこれは危険な落とし穴になる可能性があります。

  1. PHP のループには、独自のスコープがありません。- @マーク・アメリー

    変数が同じスコープで再利用されている場合、これは深刻な問題になる可能性があります。別の SO の質問は、なぜそれが問題になるのかをよく示しています

  2. foreach は PHP 5 の内部配列ポインターに依存しているため、ループ内で変更すると、予期しない動作が発生する可能性があります。- foreach の PHP ドキュメント。

    同じループの反復中にレコードを設定解除したり、ハッシュ値 (キー) を変更したりすると、PHP < 7 では予期しない動作が発生する可能性があります。配列自体が参照である場合、問題はさらに複雑になります。

  3. Foreach のパフォーマンス。
    一般に、PHP はコピー オン ライト機能により、値渡しを優先します。これは、コピーを変更する必要がない限り、内部的に PHP が重複データを作成しないことを意味します。参照渡しによってforeachパフォーマンスが向上するかどうかは議論の余地があります。いつものように、特定のシナリオをテストし、メモリと CPU 時間の使用量が少ないオプションを判断する必要があります。詳細については、NikiC によって以下にリンクされている SO の投稿を参照してください。

  4. コードの読みやすさ。
    PHP で参照を作成することは、すぐに手に負えなくなるものです。あなたが初心者で、自分がしていることを完全に制御できない場合は、参照から離れることをお勧めします。&演算子の詳細については、次のガイドを参照してください:リファレンス — PHP でこの記号が意味するものは何ですか?
    PHP 言語のこの部分について詳しく知りたい場合: PHP リファレンスの説明

foreachPHPループの内部ロジックに関する @NikiC による非常に優れた技術的説明:
PHP 'foreach' は実際にどのように機能しますか?

于 2013-02-22T12:49:00.867 に答える
15

-を使用するforeach($fields as &$field){と、元の配列で作業できます。

ここでは、参照渡しについて詳しく説明します。

于 2013-02-22T12:48:35.203 に答える
1
function checkForm(& $fields){
    foreach($fields as $field){
        if($field['required'] && strlen($_POST[$field['name']]) <= 0){
            $fields[$field]['value'] = "Some error";
        }
    }
    return $fields;
}

これは私が参照によって渡すことを提案するものです

于 2013-02-22T12:56:25.100 に答える
-7

これを試して

function checkForm($fields){
        foreach($fields as $field){
            if($field['required'] && strlen($_POST[$field['name']]) <= 0){
                $field['value'] = "Some error";
            }
        }
        return $field;
    }
于 2013-02-22T12:51:14.020 に答える