以下に示すコードは、 each() 構造体を使用して $prices 配列の内容を出力します。
each() 関数は、配列の現在の要素を返し、次の要素を現在の要素として取得します。 each() 関数は while ループ内で呼び出されるため、配列内の各要素が順番に返され、配列の最後に到達するとループ操作が終了します。 このコードでは、変数 $element は配列です。 each() が呼び出されると、4 つの数値と配列の位置を指す 4 つのインデックスを含む配列が返されます。位置 key と 0 には現在の要素のキーが含まれ、位置 value と 1 には現在の要素の値が含まれます。どちらの方法を選択するかに違いはありませんが、数値でインデックス付けされた場所ではなく、名前付きの場所を使用することを選択しました。 さらに、同じ操作を実行するためのより高度で一般的な方法があります。関数 list() を使用すると、配列を一連の値に分解できます。 each() 関数によって返される 2 つの値は次のように分離できます。
上記のコードは、 each() を使用して $prices 配列から現在の要素を削除し、それを配列として返し、次の要素を指します。また、list() を使用して、each() によって返された配列に含まれる 2 つの要素 0 と 1 を、$product と $price という名前の 2 つの新しい変数に変更します。 次のような短いスクリプトを使用して、$prices 配列全体をループし、その内容を表示できます。
このコードの出力は前のスクリプトの出力と同じですが、list() によって新しい変数に名前を付けることができるため、読みやすくなっています。 注意すべき点は、 each() 関数を使用すると、配列に現在の要素が記録されるということです。同じスクリプト内で配列を 2 回使用する場合は、reset() 関数を使用して現在の要素を配列の先頭にリセットする必要があります。価格配列を再度反復するには、次のようなコードを使用できます。
3.4 配列演算子 + 結合、== 同等、=== 同一性、!= 同等ではない、 同等ではない、!== 同一ではない。 Union 演算子は、$b の要素を $a の末尾に追加しようとします。 $b の要素が $a の一部の要素と同じインデックスを持つ場合、それらは追加されません。つまり、$a 内の要素は上書きされません。 3.5 多次元配列 配列はキーと値の単純なリストである必要はありません。配列内の各位置に別の配列を保持することもできます。この方法を使用すると、2 次元配列を作成できます。 2 次元配列は、行列、または幅と高さ、または行と列を備えたネットワークと考えることができます。 3.6 配列のソート 3.6.1 sort() 関数を使用する sort() 関数では大文字と小文字が区別されます。すべての大文字は小文字の前に表示されます。したがって、「A」は「Z」より小さく、「Z」は「a」より小さくなります。 この関数の 2 番目のパラメータはオプションです。このオプションのパラメータには、SORT_REGULAR (デフォルト)、SORT_NUMERIC、または SORT_STRING を渡すことができます。並べ替えの種類を指定する機能は、たとえば、数値 2 と 12 を含む可能性のある文字列を比較する場合に便利です。数学的な観点からは、2 は 12 より小さいですが、文字列としては、「12」は「2」より小さいです。 3.6.2 asort() 関数と ksort() 関数を使用して関連配列をソートする 関数 asort() は、各要素の値に基づいて配列を並べ替えます。 ksort() 関数は、値ではなくキーワードで並べ替えます。 3.6.3 逆ソート 関数 rsort() は、1 次元の数値インデックス配列を降順にソートします。関数 arsort() は、1 次元の連想配列を各要素の値の降順にソートします。関数 krsort() は、配列要素のキーに基づいて 1 次元配列を降順にソートします。 1 次元配列内のデータにアクセスするには、配列の名前と要素のインデックスを使用します。2 次元配列は、要素に行と列の 2 つのインデックスがある点を除き、1 次元配列と似ています。 同じ効果は、二重の for ループを使用して実現できます。
このコードを大きな配列に使用すると、はるかに簡単になります。 数値の代わりに列名を作成することもできます。次のコードを使用できます。
単一の値を取得したい場合は、この配列を使用すると、その名前を付けた列に記述された内容を保存することが簡単になります。説明的なインデックスを使用すると、要素が [x][y] の位置に格納されることを覚えておく必要がなく、意味のある行のペアを使用できます。インデックスとして使用でき、必要なデータを簡単に見つけることができます。 ただし、単純な for ループを使用して各列を順番に繰り返すことはできません。 for ループを使用して、外側の数値インデックス付き配列 $products を反復処理できます。 $products 配列の各行は、説明的なインデックスを持つ配列です。 while ループで each() 関数と list() 関数を使用すると、内部配列全体を走査できます。したがって、内部に while ループが埋め込まれた for ループが必要です。
3 次元配列には、高さ、幅、奥行きの概念があります。 2 次元配列を行と列を含むテーブルとして簡単に考えることができる場合は、3 次元配列をこのようなテーブルの束として考えることができます。各要素は、レベル、行、列によって参照できます。 多次元配列の作成方法に応じて、4 次元、5 次元、または 6 次元の配列を作成できます。 PHP では、配列の次元数に制限はありませんが、3 次元を超える配列を想像するのは困難です。実際の問題のほとんどは、論理的には 3 次元以下の配列構造の使用のみを必要とします。 3.7 多次元配列のソート 複数の次元を持つ配列を並べ替えたり、アルファベット順や数値順に並べ替えたりすることは、はるかに複雑です。 PHP は 2 つの数値または文字列を比較する方法を知っていますが、多次元配列では各要素が配列になります。 PHP は 2 つの配列を比較する方法を知らないため、それらを比較するメソッドを構築する必要があります。ほとんどの場合、単語と数字の順序は明らかですが、複雑なオブジェクトの場合は少し問題が生じます。 3.7.1 ユーザー定義の並べ替え この関数ではユーザー定義の比較関数を渡す必要があるため、usort() の「u」は「ユーザー」を表します。 asort と ksort の対応するバージョンである uasort() と uksort() にも、ユーザー定義の比較関数を渡す必要があります。 asort() と同様に、uasort() は数値以外のインデックス配列内の値を並べ替えるときに使用されます。値が単純な数値またはテキストの場合は、asort を使用できます。比較する値が配列と同じくらい複雑な場合は、比較関数を定義してから uasort() を使用できます。 ksort() と同様に、非数値インデックス配列のキーでソートする場合にのみ uksort() を使用します。値が単純な数値またはテキストの場合は、ksort を使用します。比較するオブジェクトが配列のように複雑な場合は、比較関数を定義して uksort() を使用できます。 3.7.2 ユーザーの並べ替えを逆にする 関数 sort()、asort()、および ksort() はそれぞれ、文字「r」を含む逆ソート関数に対応します。ユーザー定義の並べ替えの逆の変形はありませんが、多次元配列は逆に並べ替えることができます。 3.8 配列を並べ替える 3.8.1 shuffle()関数を使用する PHP の以前のバージョンでは、shuffle() では、srand() 関数を呼び出すときに最初に乱数ジェネレーターを提供する必要がありました。現在、この手順は必要ありません。 この関数が重要な場合は、プログラムに適用する前にサーバー上でテストできます。 実際に配列全体を並べ替える必要がないため、array_rand() 関数を使用して同じ機能を実現できます。 3.8.2 array_reverse() 関数の使用 array_reverse() 関数は、配列をパラメータとして受け取り、パラメータ配列と同じ内容の配列を逆の順序で返します。 range() 関数を単独で使用すると昇順のシーケンスが作成されるため、配列内の数値を降順に変更するには、sort() 関数または array_reverse() 関数を使用する必要があります。あるいは、for ループを使用して、一度に 1 要素ずつ配列を作成することもできます。のように:
for ループは次のように降順で実行できます。カウンターは、 for ループは次のように降順で実行できます。カウンタの初期値を大きな数値に設定し、演算子「--」を使用して各ループの終了時にカウンタを 1 ずつ減らすことができます。 ここでは、空の配列を作成し、array_push() 関数を使用して各新しい要素を配列の末尾に追加します。 array_push() の反対の関数は array_pop() であり、配列の末尾の要素を削除して返します。 あるいは、array_reverse() 関数を使用して、range() 関数によって作成された配列を逆にすることもできます。 array_reverse() 関数は、元の配列の変更されたコピーを返すことに注意してください。この例のように、元の配列が不要になった場合は、元のバージョンを新しいコピーで上書きできます。 データが単なる一連の整数の場合は、range() 関数の 3 番目のオプション引数として -1 を渡すことで、逆の順序で配列を作成できます。 3.9 ファイルから配列をロード file() 関数を使用して、ファイル全体を配列にロードします。ファイル内の各行は配列内の要素になります。 count() 関数は、配列内の要素の数をカウントするために使用されます。 explode("t", $orders[$i]) explode() 関数は、受信文字列を小さな部分に分割できます。各タブは 2 つの要素間のブレークポイントになります。この関数のオプションのlimitパラメータを使用して、返されるブロックの最大数を制限できます。 文字列から数値を抽出するために使用できる方法は数多くあります。ここでは intval() 関数を使用しました。文字列を整数に変換します。この変換は非常にインテリジェントであり、ラベルを数値に変換できないなど、特定の部分を無視できます。 3.10 他の配列操作を実行する 3.10.1 配列内の参照: each()、current()、reset()、end()、next()、pos()、prev() 前述したように、すべての配列には、配列内の現在の要素を指す内部ポインターがあります。 each() 関数を使用する場合、このポインタは間接的に使用されますが、このポインタは直接使用して操作することもできます。 新しい配列を作成すると、現在のポインターが初期化され、配列の最初の要素を指します。 next() または each() を呼び出すと、ポインターが 1 要素進みます。 each($array_name) を呼び出すと、ポインターを 1 位置進める前に現在の要素が返されます。 next() 関数は少し異なります。next($array_name) を呼び出すとポインターが進み、新しい現在の要素が返されます。 end($array_name) を呼び出すと、ポインタが配列の末尾に移動します。 配列を逆順に走査するには、end() 関数と prev() 関数を使用します。 prev() 関数は next() 関数の逆です。現在のポインタを 1 つ前の位置に戻してから、新しい現在の要素を返します。 3.10.2 配列の各要素に任意の関数を適用します: array_walk() array_walk() 関数には 3 つのパラメータが必要です。最初のものは arr で、これは処理する必要がある配列です。 2 番目は func で、配列内の各要素に作用するユーザー定義関数です。 3 番目のパラメーター userdata はオプションであり、使用する場合はパラメーターとして独自の関数に渡すことができます。 より複雑な問題の例を見てみましょう。
ここでは、配列内の各要素に指定された乗算係数を乗算する my_multiply() という関数を定義します。 さらに、注意が必要なもう 1 つの問題は、$value の受け渡し方法です。 my_multiply() の関数定義では、変数の前のアドレス文字 (&) は、$value が参照によって渡されることを意味します。参照渡しにより、関数は配列の内容を変更できます。 3.10.3 配列要素の数をカウントする: count()、sizeof()、array_count_values() count() 関数と sizeof() 関数は同じ目的を持ち、どちらも配列要素の数を返すことができます。通常のスカラー変数の要素数を取得できます。この関数に渡された配列が空の配列、または設定されていない変数の場合、返される配列の数は 0 です。 array_count_values($array) を呼び出すと、この関数は、配列 $array (これは配列のカーディナリティ セットです) 内に各特定の値が出現する回数をカウントします。 この関数は、頻度テーブルを含む関連配列を返します。この配列には配列 $array 内のすべての値が含まれており、これらの値を関連する配列へのキーとして使用します。各キーワードに対応する値は、配列 $array 内にキーワードが出現する回数です。 3.10.4 配列をスカラー変数に変換: extract() 多くのキーと値のペアを持つ非数値インデックス付き配列の場合、関数 extract() を使用してそれらを一連のスカラー変数に変換できます。 extract() 関数は、配列から一連のスカラー変数を作成します。これらの変数の名前は配列内のキーワードの名前である必要があり、変数の値は配列内の値です。 extract() 関数には、extract_type と prefix という 2 つのオプションのパラメータがあります。変数 extract_type は、extract() 関数に競合の処理方法を指示します。場合によっては、配列キーワードと同じ名前の変数がすでに存在する可能性があり、この関数のデフォルトの動作は既存の変数を上書きすることです。 最も一般的に使用される 2 つのオプションは、EXTR_OVERWRITE (デフォルト) と EXTR_PREFIX_ALL です。特定の競合が発生することがわかっていて、キーワードをスキップまたはプレフィックスしたい場合は、追加のオプションを使用できます。 extract() は、キーワードが有効な変数名でなければならない要素を抽出できます。つまり、数字で始まるキーワードやスペースを含むキーワードはスキップされます。 |