コンピューター ウィンドウズ インターネット

PHPforeachコマンド PHPでのforeachの複雑さについて。 リスト()を使用してネストされた配列を解凍します

For Each ...の次のループ VBA Excel、その構文と個々のコンポーネントの説明。 For Each ... Nextループの使用例。

VBAExcelのForEach ... Nextループは、要素のグループ(範囲、配列、コレクション)の各要素に関するステートメントのブロックを実行するように設計されています。 このすばらしいループは、グループ内の要素の数とそのインデックスが不明な場合に使用されます。それ以外の場合は、このループを使用することをお勧めします。

For Each ...次のループ構文

グループ内の各要素について[ステートメント] [終了] [ステートメント]次の[要素]

V 角括弧 For Each ... Nextループのオプションの属性が指定されます。

For Each ...次のループコンポーネント

*For Each ... NextループをVBAExcelで使用して、コレクション(コレクションオブジェクト)または配列の要素をループする場合、変数 エレメントデータ型で宣言する必要があります 変異体そうしないと、ループは機能しません。

**ループでコードを使用しないと、ループを使用する意味が失われます。

For Each ...次のループの例

セルの範囲をループする

Excelブックのアクティブなシートで、セルの範囲を選択し、次の手順を実行します。

Sub test1()Dim element As Range、a As String a = "For Each ... Next:" For Each element In Selection a = a&vbNewLine& "Cell"&element.Address&_ "には、値: "&CStr(element.Value)Next MsgBox a End Sub

MsgBox情報ウィンドウには、選択したセルのアドレスとその内容(存在する場合)が表示されます。 多くのセルが選択されている場合、パラメータの最大長のため、すべてのセルの完全な情報は表示されません。 促すは約1024文字です。

シート収集のためのループ

次のVBAプロシージャをExcelブックにコピーします。

Sub test2()Dim element As Worksheet、a As String a = "この本に含まれるワークシートのリスト:" For Each element In Worksheets a = a&vbNewLine&element.Index _& ")"&element.Name Next MsgBox aエンドサブ

MsgBox情報ウィンドウには、Excelブックのすべてのシートの名前のリストが、インデックスに対応するタブの序数で表示されます。

配列のループ

動物名のリストを配列に割り当て、For Each ...次のループでそれらを変数に書き込みます NS..。 情報ウィンドウMsgBoxは、変数からの動物名のリストを表示します NS.

Sub test3()Dim element As Variant、As String、group As Variant group = Array( "hippopotamus"、 "elephant"、 "kangaroo"、 "tiger"、 "mouse") "シート、たとえば選択されたもの:group =選択a = "配列には次の値が含まれます:"&vbNewLine For Each element In group a = a&vbNewLine&element Next MsgBox a End Sub

同じVBA手順を繰り返しますが、For Each ... Nextループのすべての配列要素をParrotに設定します。 MsgBox情報ウィンドウには、オウムのみで構成される動物名のリストが表示されます。これは、For Each ... Nextループの配列要素の値を編集できることを示しています。

Sub test4()Dim element As Variant、As String、group As Variant group = Array( "hippopotamus"、 "elephant"、 "kangaroo"、 "tiger"、 "mouse") "シート、たとえば、選択したもの: group = Selection a = "配列には次の値が含まれます:"&vbNewLine For Each element In group element = "Parrot" a = a&vbNewLine&element Next MsgBox a End Sub

このコードは、この記事の他のすべてと同様に、Excel2016でテストされました。

サブディレクトリの収集のためにループし、ループを終了します

この例では、変数に追加します NSディスク上のサブディレクトリの名前 NSあなたのコンピュータ。 サイクルがフォルダに到達したとき プログラムファイル、変数に追加されます NSその名前とメッセージ:「もう十分です、これ以上読みません! よろしくお願いいたします。ForEach...次のループ。」

Sub test5()Dim FSO As Object、myFolders As Object、myFolder As Object、As String "新しいFileSystemObjectを作成し、それを" FSO "変数に割り当てますSetFSO = CreateObject(" Scripting.FileSystemObject ")"のリストを抽出しますディスク "C"のサブディレクトリを変数 "myFolders"に割り当てます。SetmyFolders= FSO.GetFolder( "C:\")a = "Folders on disk C:"&vbNewLine "サブディレクトリのリストをループして、それらを追加します。 「ProgramFiles」フォルダに到達した後、変数「a」に名前を付け、ループを終了します。ForEach myFolder In myFolders.SubFolders a = a&vbNewLine&myFolder.Name If myFolder.Name = "Program Files" Then a = a& vbNewLine&vbNewLine& "十分です、読みません!" _&vbNewLine&vbNewLine& "よろしく"&vbNewLine&_ "Your For Each ... Nextloop。" Exit For End If Next Set FSO = Nothing MsgBoxエンドサブ

情報ウィンドウMsgBoxは、ディスク上のサブディレクトリの名前のリストを表示します NSコンピュータをフォルダに移動します プログラムファイル包括的であり、その作業の終了に関するサイクルのメッセージ。

プログラムの作業の結果、エクスプローラーでディスクに移動したときに表示されるサブディレクトリの名前だけでなく、表示されます。 NSだけでなく、隠されて サービスフォルダ..。 ディスク上のすべてのサブディレクトリのリストを表示するには NS、からコードセクションをコメントアウトします もしも終了する場合包括的で、VBAExcelエディターでプロシージャを実行します。

whileループとforeachループを実行します

doループ。 ..。 ..。 その間

do ... whileループ C#では、whileの事後バージョンです。 これは、ループ本体の実行後にループ条件がチェックされることを意味します。 したがって、do ... whileループは、ステートメントのブロックを少なくとも1回実行する必要がある状況で役立ちます。 以下は、do-whileループステートメントの一般的な形式です。

do(ステートメント;)while(条件);

演算子が1つしかない場合、この表記では中括弧はオプションです。 ただし、これらは、do-while構文を読みやすくし、whileループ構文と混同しないようにするためによく使用されます。 do-whileループは、条件式がtrueである限り実行されます。 do-whileループの使用例は、数値の階乗を計算する次のプログラムです。

システムの使用; System.Collections.Genericを使用する; System.Linqを使用する; System.Textを使用します。 名前空間ConsoleApplication1(class Program(static void Main(string args)(try(// int iの階乗を計算、result = 1、num = 1; Console.WriteLine( "Enter a number:"); i = int.Parse (Console .ReadLine()); Console.Write( "\ n \ nFactorial(0)="、i); do(result * = num; num ++;)while(num

Foreachループ

Foreachループオブジェクトのグループであるコレクションの要素への循環アクセスに役立ちます。 C#はいくつかの種類のコレクションを定義し、それぞれが配列です。 以下は、foreachループステートメントの一般的な形式です。

foreach(コレクション内のタイプloop_variable_name)演算子;

ここ タイプcycle_variable_name foreachループの各ステップでコレクション内の次の項目の値を取得するループ制御変数のタイプと名前を示します。 また、コレクションは、周期的にポーリングされるコレクションを示します。これを以下は配列とします。 したがって、ループ変数の型は配列要素の型と一致する必要があります。 さらに、タイプを示すことができます キーワード var。 この場合、コンパイラーは配列要素のタイプに基づいてループ変数のタイプを判別します。 これは、特定の種類のクエリを処理する場合に役立ちます。 ただし、原則として、タイプは明示的に指定されます。

foreachループステートメントは次のように機能します。 ループが開始されると、配列の最初の要素が選択され、ループ変数に割り当てられます。 反復の後続の各ステップで、配列の次の要素が選択され、ループ変数に格納されます。 配列のすべての要素が選択されると、ループは終了します。

foreachループを使用すると、コレクション内の各アイテム(他のオブジェクトのリストを表すオブジェクト)をループできます。 正式には、何かがコレクションと見なされるためには、IEnumerableインターフェイスをサポートしている必要があります。 コレクションの例には、C#配列、System.Collection名前空間のコレクションクラス、カスタムコレクションクラスが含まれます。

(PHP 4、PHP 5、PHP 7)

設計 foreach配列を反復処理する簡単な方法を提供します。 Foreach配列とオブジェクトでのみ機能し、他のタイプの変数または初期化されていない変数で使用しようとするとエラーが発生します。 構文には次の2つのタイプがあります。

foreach(array_expression as $ value)ステートメントforeach(array_expression as $ key => $ value)ステートメント

最初のループは、で指定された配列を繰り返し処理します array_expression..。 各反復で、現在の要素の値が変数に割り当てられます $値配列の内部ポインタが1つ増えます(したがって、ループの次の反復で、次の要素で作業が行われます)。

2番目のループは、現在の要素のキーを変数とさらに相関させます $キー各反復で。

コメント:

オペレーターが foreach実行を開始すると、配列の内部ポインタが自動的に最初の要素に設定されます。これは、関数を呼び出す必要がないことを意味します。 リセット()ループを使用する前に foreach.

オペレーター以来 foreach内部配列ポインターに依存しているため、ループ内でポインターを変更すると、予期しない動作が発生する可能性があります。

ループ内の配列の要素を直接変更するために、変数 $値&を前に付ける必要があります。 この場合、値は参照によって割り当てられます。

$ arr =配列(1、2、3、4);
foreach($ arr as&$ value)(
$値= $値* 2;
}
// $ arrは配列(2、4、6、8)になりました
未設定($値); //最後の要素へのリンクを解除します
?>

へのポインタ $値繰り返される配列を参照できる場合(つまり、変数の場合)にのみ可能です。 次のコードは機能しません。

foreach(array(1、2、3、4)as&$ value)(
$値= $値* 2;
}
?>

注意

リンク $値配列の最後の要素は、演算子の後も残ります foreach完成した作品。 関数を使用して破棄することをお勧めします 未設定().

コメント:

オペレーター foreach「@」プレフィックスを使用してエラーメッセージを抑制する機能はサポートしていません。

次の構成が機能的に同一であることに気付いたかもしれません。


リセット($ arr);
while(list(、$ value)= each($ arr))(
echo "値:$値
\ NS ";
}

foreach($ arr as $ value)(
echo "値:$値
\ NS ";
}
?>

次の構成も機能的に同じです。

$ arr = array( "one"、 "two"、 "three");
リセット($ arr);
while(list($ key、$ value)= each($ arr))(

\ NS ";
}

foreach($ arr as $ key => $ value)(
echo "キー:$キー;値:$値
\ NS ";
}
?>

演算子の使用法を示すいくつかの例を次に示します。

/ *例1:値のみ* /

$ a =配列(1、2、3、17);

foreach($ a as $ v)(
エコー "\ $変数の現在の値:$ v。\ n ";
}

/ *例2:値(説明のために、配列はキー付きの値として出力されます)* /

$ a =配列(1、2、3、17);

$ i = 0; / *説明のみ* /

Foreach($ a as $ v)(
echo "\ $ a [$ i] => $ v。\ n";
$ i ++;
}

/ *例3:キーと値* /

$ a =配列(
「1つ」=> 1
「2」=> 2
「3」=> 3
「セブンティーン」=> 17
);

foreach($ a as $ k => $ v)(
echo "\ $ a [$ k] => $ v。\ n";
}

/ *例4:多次元配列* /
$ a =配列();
$ a [0] [0] = "a";
$ a [0] [1] = "b";
$ a [1] [0] = "y";
$ a [1] [1] = "z";

foreach($ a as $ v1)(
foreach($ v1 as $ v2)(
エコー "$ v2 \ n";
}
}

/ *例5:動的配列* /

Foreach(array(1、2、3、4、5)as $ v)(
エコー "$ v \ n";
}
?>

リスト()を使用してネストされた配列を解凍します

(PHP 5> = 5.5.0、PHP 7)

PHP 5.5は、ネストされた配列をループ変数にアンパックして、配列の配列をトラバースする機能を追加しました。 リスト()値として。

foreach構造は、配列の要素を反復処理しやすくするために言語に含まれているforのフレーバーです。 foreachコマンドには、さまざまなタイプの配列を対象とする2つのフレーバーがあります。

foreach($要素としての配列)(

foreach($キーとしての配列=> $要素)(

たとえば、次のスニペットを実行する場合:

$ menu =аrrау(「パスタ」、「ステーキ」、「ジャガイモ」、「魚」、「フライ」);

foreach($メニューを$アイテムとして)(

印刷 "$ item
";

次の出力が表示されます。

この例では、2つのことに注意する必要があります。 まず、foreachコンストラクトは自動的に配列の先頭に戻ります(これは他のループコンストラクトでは発生しません)。 次に、カウンターを明示的にインクリメントしたり、配列内の次の要素に移動したりする必要はありません。これは、foreachが繰り返されるたびに自動的に行われます。

2番目のオプションは、連想配列を操作するときに使用されます。

$ wine_inventory = array(

「メルロー」=> 15

「ジンファンデル」=> 17

「ソーヴィニヨン」=> 32

foreach($ wine_inventory as $ i => $ item_count)(

印刷 "$ item_countボトルの$ iが残っています
";

この場合、結果は次のようになります。

残り15本のメルロー

残り17本のジンファンデル

残り32本のソーヴィニヨン

上記の例からわかるように、foreach構造を使用すると、配列の操作がはるかに簡単になります。

スイッチ構造の動作原理は、次の場合と多少似ています。式を評価したときに得られた結果が、一致する可能性のあるリストと照合されます。

スイッチを使用するとプログラムがよりわかりやすくコンパクトになるため、これは複数の値をチェックするときに特に役立ちます。 switchコマンドの一般的な形式は次のとおりです。

switch(式)(

ケース(条件):

ケース(条件):

チェックする条件は、switchキーワードの後の括弧内に示されています。 その計算結果は、ケースセクションの条件と順次比較されます。 一致するものが見つかると、対応するセクションのブロックが実行されます。 一致するものが見つからない場合、オプションのデフォルトセクションブロックが実行されます。

次の章でわかるように、PHPの長所の1つは、ユーザー入力を処理することです。 プログラムがいくつかのオプションを含むドロップダウンリストを表示し、リストの各行が個別のケース構造で実行されるコマンドに対応するとします。 switchコマンドを使用して実装を構築すると非常に便利です。

$ user_input = "レシピ"; //ユーザーが選択したコマンド

スイッチ($ user_input):

ケース(「検索」):

print "Let" s検索を実行しましょう! ";

ケース(「辞書」):

print "どの単語を検索しますか?";

ケース(「レシピ」):

print "これがレシピのリストです...";

print "これがメニューです...";

上記のスニペットからわかるように、switchコマンドは、コードの明確で直感的な構成を提供します。 switch句で指定された変数(この例では$ user_input)は、後続のすべてのケースセクションの条件と比較されます。 caseセクションで指定された値が、比較される変数の値と一致する場合、このセクションのブロックが実行されます。 breakステートメントは、それ以上のcaseセクションがチェックされるのを防ぎ、switchステートメントを終了します。 チェックされた条件のいずれも満たされない場合、オプションのデフォルトセクションが呼び出されます。 デフォルトのセクションがなく、いずれの条件も満たされない場合、switchコマンドは単に終了し、プログラムの実行は次のコマンドから続行されます。

caseセクションにbreakステートメントがない場合(次のセクションを参照)、breakステートメントが検出されるか、switchステートメントの終わりに達するまで、スイッチの実行は次のステートメントから続行されることを覚えておく必要があります。 次の例は、忘れられたbreakコマンドを見逃した場合の結果を示しています。$ value = 0.4;

スイッチ($値):

印刷 "値は0.4です
";

印刷 "値は0.6です
";

印刷 "値は0.3です
";

print "あなたは"値を選択しませんでした! ";

結果は次のようになります。

breakコマンドがないため、一致が見つかったセクションでprintコマンドが実行されるだけでなく、次のセクションでprintコマンドも実行されました。 次に、switchステートメントの実行は、2番目のprintステートメントに続くswitchステートメントによって中断されました。

スイッチとifコマンドのどちらを選択しても、プログラムのパフォーマンスにはほとんど影響しません。 これまたはその構造を使用するかどうかの決定は、プログラマーの個人的な問題です。

breakステートメントは、それが配置されているwhile、for、またはswitchステートメントの実行をただちに中断します。 このコマンドは前のセクションですでに説明しましたが、現在のループを中断しても、breakコマンドの機能が使い果たされることはありません。 一般に、break構文は次のようになります。

オプションのパラメーターnは、breakコマンドによって終了される制御構造のレベル数を指定します。 たとえば、ブレークが2つのwhileステートメント内にネストされていて、数値2がブレークの後にある場合、両方のループがすぐに終了します。 nのデフォルト値は1です。 1つのレベルに進むことは、1の明示的な表示、またはパラメーターなしのbreakコマンドの表示のいずれかによって示されます。 i fコマンドは、breakコマンドによって中断される制御構造の1つではないことに注意してください。

多くの場合、PHP配列のすべての要素を調べて、各要素に対して何らかの操作を実行する必要があります。 たとえば、各値をHTMLテーブルに出力したり、各要素に新しい値を割り当てたりすることができます。

このレッスンでは、インデックス付きの連想配列をループするときのforeach構造を見ていきます。

要素値をループする

foreachの最も単純なユースケースは、インデックス付き配列の値をループする場合です。 基本構文:

Foreach($ array as $ value)(// $ valueで何かを行う)//ここでは、ループが終了した後にコードが実行されます

たとえば、次のスクリプトは、インデックス付き配列内のディレクターのリストをループし、それぞれの名前を出力します。

$ directors = array( "Alfred Hitchcock"、 "Stanley Kubrick"、 "Martin Scorsese"、 "Fritz Lang"); foreach($ディレクターとして$ディレクター)(echo $ディレクター。 "
"; }

上記のコードは次のように出力します。

アルフレッド・ヒッチコックスタンリー・キューブリックマーティン・スコセッシフリッツ・ラング

キーと値をループする

連想配列はどうですか? これらのタイプの配列を使用する場合、多くの場合、各要素のキーとその値にアクセスする必要があります。 foreachコンストラクトには、このタスクを実行する方法があります。

Foreach($ array as $ key => $ value)(// $ keyおよび/または$ valueで何かを行う)//ここでは、ループが終了した後にコードが実行されます

映画に関する情報を含む連想配列を介してループを編成する例では、各要素のキーとその値をHTML定義リストに表示します。

$ movie = array( "title" => "Rear Window"、 "director" => "Alfred Hitchcock"、 "year" => 1954、 "minutes" => 112); エコー "

"; foreach($ movie as $ key => $ value)(echo"
$キー:
"; エコー"
$値
";) エコー"
";

このスクリプトは、実行時に出力されます。

タイトル:リアウィンドウ監督:アルフレッド・ヒッチコック年:1954分:112

要素の値を変更する

しかし、ループ中の要素の値の変化はどうですか? 次のようなコードを試すことができます。

Foreach($ myArray as $ value)($ value = 123;)

ただし、実行のために実行すると、配列内の値がわかります 変えないで..。 その理由は、foreachが コピー元の値ではなく、配列の値。 これにより、元の配列はそのまま残ります。

配列の値を変更するには、 リンク値に。 これを行うには、foreach構文のvalue変数の前に&記号を付ける必要があります。

Foreach($ myArray as&$ value)($ value = 123;)

たとえば、次のスクリプトは、$ directors配列内の(director's name)の各要素をループし、PHPのexplode()関数とlist構文を使用して、名前と名前を入れ替えます。

$ directors = array( "Alfred Hitchcock"、 "Stanley Kubrick"、 "Martin Scorsese"、 "Fritz Lang"); //各要素の名前形式を変更しますforeach($ directors as&$ director)(list($ firstName、$ lastName)= explode( ""、$ director); $ director = "$ lastName、$ firstName";)unset ($ディレクター); //最終結果foreachを出力します($ directorsを$ directorとして)(echo $ director。 "
"; }

スクリプトは次のように出力します。

ヒッチコック、アルフレッドキューブリック、スタンリースコセッシ、マーティンラング、フリッツ

スクリプトは、最初のループが終了した後、unset()関数を呼び出して$ director変数を削除することに注意してください。 これは、スクリプトの後半で別のコンテキストで変数を使用することを計画している場合に適しています。

リンクを削除しない場合、$ダイレクタ変数を引き続き使用すると、配列の最後の要素( "Lang、Fritz")へのランダム参照のコードがさらに実行されるリスクがあります。予期せぬ結果につながります!

概要

このチュートリアルでは、PHPのforeachコンストラクトを使用して配列の要素をループする方法について説明しました。 次の問題が考慮されました。

  • 配列の要素をループする方法
  • 各アイテムのキーと値にアクセスする方法
  • ループを歩きながら参照を使用して値を変更する方法