126

foreachループ内で処理されている現在のオブジェクトを編集できるかどうか疑問に思いました

私はオブジェクトの配列を$questions操作していて、データベースでその質問オブジェクトに関連付けられている回答を調べて探したいと思います。したがって、質問ごとに回答オブジェクトをフェッチし、ループ$question 内の現在の値を更新して、他の場所で出力/処理できるようにします。foreach

foreach($questions as $question){
    $question['answers'] = $answers_model->get_answers_by_question_id($question['question_id']);
}
4

2 に答える 2

241

これを行うには2つの方法があります

foreach($questions as $key => $question){
    $questions[$key]['answers'] = $answers_model->get_answers_by_question_id($question['question_id']);
}

$questionsこのようにしてキーを保存するので、メイン変数でキーを再度更新できます

また

foreach($questions as &$question){

を追加すると、最新の&状態に保たれます。$questionsしかし、これは短いですが、最初のものが推奨されると思います(Paysteyによるコメントを参照)

PHPforeachドキュメントによると:

ループ内の配列要素を直接変更できるようにするには、$ valueの前に&を付けます。その場合、値は参照によって割り当てられます。

于 2012-04-12T10:08:55.557 に答える
9

確かに、オブジェクトを派生させるためarray_mapに実装するコンテナを使用する場合、これを実行ArrayAccessするためのよりスマートでセマンティックな方法ですか?

配列マップのセマンティクスは、私が見たほとんどの言語と実装で類似しています。これは、入力配列要素に基づいて変更された配列を返すように設計されています(言語のコンパイル/ランタイムタイプの設定を無視する高レベル)。ループは、より多くのロジックを実行することを目的としています。

ID / PKでオブジェクトを取得する場合、SQLを使用しているかどうかに応じて(推奨されているようです)、フィルターを使用して有効なPKの配列を取得し、コンマでインプローディングしてSQLIN()句に配置します。結果セットを返します。SQLを介して複数回ではなく、1回の呼び出しを行い、call->waitサイクルのビットを最適化します。最も重要なことは、私のコードはある程度の能力を持ったどの言語の人にもよく読まれ、可変性の問題に遭遇することはありません。

<?php

$arr = [0,1,2,3,4];
$arr2 = array_map(function($value) { return is_int($value) ? $value*2 : $value; }, $arr);
var_dump($arr);
var_dump($arr2);

vs

<?php

$arr = [0,1,2,3,4];
foreach($arr as $i => $item) {
    $arr[$i] = is_int($item) ? $item * 2 : $item;
}
var_dump($arr);

自分が何をしているのかがわかっている場合は、可変性の問題が発生することはありません(上書きする$arr場合は、常に$arr = array_map明示的にすることができます。

于 2017-01-25T11:03:47.727 に答える