配列の使用
配列は、一連の値または一連の値を格納できる変数です。配列には多くの要素を含めることができます。各要素には、テキスト、数値、または別の配列などの値があります。他の配列を含む配列は、多次元配列と呼ばれます。
配列とは何ですか?
スカラー変数は、値を格納するために使用される名前付き領域です。同様に、配列は一連の変数値を格納するために使用される名前付き領域であるため、配列を使用してスカラー変数を整理できます。
配列に格納される値を配列要素と呼びます。各配列要素には、要素へのアクセスに使用できる関連インデックス (キーとも呼ばれます) があります。ほとんどのプログラミング言語では、配列には数値インデックスがあり、これらのインデックスは通常 0 または 1 から始まります。
数値インデックス配列
PHPでは数値インデックスのデフォルト値は0から始まりますが、もちろん変更可能です。
1. 数値インデックス配列の初期化
$porducts = array('tires', 'Oil', 'Spark Plugs');
echo ステートメントと同様に、array() は実際には関数ではなく言語構造です。
配列の内容の要件によっては、上記の例のように手動で初期化する必要がない場合があります。必要なデータが別の配列に保持されている場合は、演算子 "=" を使用して、その配列を別の配列にコピーするだけです。 数値を昇順で配列に保存する必要がある場合は、 range() 関数を使用してこの配列を自動的に作成できます。次のコード行は、1 から 10 までの数値の配列を作成します。 $numbers = range(1,10); range() 関数には、値間のステップを設定できるオプションの 3 番目のパラメーターがあります。たとえば、1 から 10 までの奇数の配列を作成する必要がある場合は、次のコードを使用できます。 $odds = range(1,10,2); range() 関数は、次のような文字を操作することもできます。 : $letters = range ('a', 'z');
2. 配列の内容にアクセスする
変数の内容にアクセスするには、その名前を直接使用できます。変数が配列の場合、変数名とキーワードまたはインデックスの組み合わせを使用してその内容にアクセスできます。キーワードまたはインデックスは、アクセスする変数を指定します。インデックスは変数名の後に角括弧で囲まれています。
デフォルトでは、要素 0 が配列の最初の要素です。
PHP の文字列解析機能は非常に強力でスマートですが、混乱を引き起こす可能性があることに注意してください。二重引用符内の文字列に配列またはその他の変数を埋め込むときに、それらが正しく解釈されない場合は、それらを二重引用符の外側に配置するか、第 4 章の「
正規表現による文字列操作
」を参照して、より複雑な構文を取得することができます。
PHP の他の変数と同様に、配列を事前に初期化したり作成したりする必要はありません。これらは、初めて使用するときに自動的に作成されます。 3. ループを使用して配列にアクセスする 配列は順序付けられた数値をインデックスとして使用するため、for ループを使用して配列の内容を簡単に表示できます。
for ($i=0; $iecho "$products[$i]";
単純なループを使用して各要素にアクセスできることは、数値インデックス付き配列の非常に優れた機能です。配列用に特別に設計された foreach ループを使用することもできます。例:
foreach ($products as $current)
echo $current. ' ';
異なるインデックスを持つ配列を使用する
PHP は関連する配列もサポートしています。連想配列では、各変数値を任意のキーまたはインデックスに関連付けることができます。
1 関連配列を初期化します
以下に示すコードは、製品名をキー、価格を値として持つ関連配列を作成できます。 10 , 'Spark Plugs'=>4 );
キーワードと値の間の記号は、大なり記号と等号だけです。
2 配列要素へのアクセス
同様に、変数名とキーワードを使用して配列の内容にアクセスできます。たとえば、$prices['タイヤ']。
3 ループ ステートメントを使用する
関連する配列のインデックスは数値ではないため、単純なカウンターを使用して for ループ ステートメント内で配列を操作することはできません。ただし、foreach ループや list() および each() 構造を使用することはできます。
foreach ループ ステートメントを使用して関連する配列を操作する場合、foreach() ループの構造は異なります。キーワードは次のように使用できます:
foreach ($prices as $key => $value) echo $key.'=>'.$value.'<br />'; 如下所示的代码将使用each()结构打印$prices数组的内容: while( $element = each($prices)) { echo $element['key']; echo ' - '; echo $element['value']; echo '<br />'; }
each() 関数は、配列の現在の要素と次の要素を現在の要素として返します。 each() 関数は while ループ内で呼び出されるため、配列内の各要素が順番に返され、配列の最後に到達するとループ操作が終了します。
このコードでは、変数 $element は配列です。 each() が呼び出されると、4 つの数値と配列の位置を指す 4 つのインデックスを含む配列が返されます。位置 key と 0 には現在の要素のキーが含まれ、位置 value と 1 には現在の要素の値が含まれます。どの方法を選択しても違いはありませんが、数値でインデックス付けされた場所ではなく、名前付きの場所を使用することを選択しました。
また、同じ操作を実行するためのより高度で一般的な方法もあります。関数 list() を使用すると、配列を一連の値に分解できます。 each() 関数によって返される 2 つの値は次のように分離できます: list( $product, $price) = each( $price)
上記のコードは each() を使用して $ から現在の要素を取り出します。価格配列を追加し、配列として返され、次の要素を指します。また、list() を使用して、each() によって返された配列に含まれる 2 つの要素 0 と 1 を、$product と $price という名前の 2 つの新しい変数に変更します。
次のような短いスクリプトを使用して $prices 配列全体をループし、その内容を表示できます:
while(list($prodct, $pirce) = each($prices)) echo "$product - $price<br />";
このコードの出力は前のスクリプトの出力と同じですが、リストがあるため読みやすくなっています。 () 新しい変数に名前を付けることができます。
注意すべき点は、 each() 関数を使用すると、配列に現在の要素が記録されるということです。同じスクリプト内で配列を 2 回使用する場合は、reset() 関数を使用して現在の要素を配列の先頭にリセットする必要があります。価格配列を再度反復するには、次のようなコードを使用できます:
reset($prices);
while(list($product, $price) = each($prices))
echo "$product - $price3758937f2e19267c4b26eb8fbb84b4a2";
配列演算子
+union、== は同等、=== は同一、!= は同等ではない、a8093152e673feb7aba1828c43532094 は同等ではない、!== は同一ではない。
ユニオン演算子は、$b の要素を $a の末尾に追加しようとします。 $b の要素が $a の一部の要素と同じインデックスを持つ場合、それらは追加されません。つまり、$a 内の要素は上書きされません。
多次元配列
配列は、キーと値の単純なリストである必要はありません。配列内の各位置に別の配列を保持することもできます。この方法を使用すると、2 次元配列を作成できます。 2 次元配列は、行列、または幅と高さ、または行と列を備えたネットワークと考えることができます。
配列の並べ替え
1 sort() 関数を使用します
sort() 関数は大文字と小文字を区別します。すべての大文字は小文字の前に表示されます。したがって、「A」は「Z」より小さく、「Z」は「a」より小さくなります。
関数の 2 番目のパラメーターはオプションです。このオプションのパラメータには、SORT_REGULAR (デフォルト)、SORT_NUMERIC、または SORT_STRING を渡すことができます。並べ替えの種類を指定する機能は、たとえば、数値 2 と 12 を含む可能性のある文字列を比較する場合に便利です。数学的な観点からは、2 は 12 より小さいですが、文字列としては、「12」は「2」より小さいです。
2 asort() 関数と ksort() 関数を使用して、関連する配列を並べ替えます。
関数 asort() は、配列の各要素の値に基づいて並べ替えます。 ksort() 関数は、値ではなくキーワードで並べ替えます。
3 逆ソート
rsort() 関数は、1 次元の数値インデックス配列を降順にソートします。関数 arsort() は、1 次元の連想配列を各要素の値の降順にソートします。関数 krsort() は、配列要素のキーに従って、一次元配列を降順に並べ替えます。
1 次元配列内のデータにアクセスするには、配列の名前と要素のインデックスを使用する必要があります。2 次元配列は、要素に行と列の 2 つのインデックスがある点を除き、1 次元配列と似ています。 。
二重の for ループを使用して同じ効果を実現できます:
for ( $row=0; $row<3; $row++ ) { for ( $column=0; $column<3; $column++ ) { echo '|'.$products[$row][$column]; | echo '|<br />'; }
このコードを大きな配列に使用すると、はるかに簡単になります。
数値の代わりに列名を作成することもできます。次のようなコードを使用できます:
$products = array ( array ( 'Code'=>'TIR', 'Descrīption'=>'Tires', 'Price'=>100 ), array ( 'Code'=>'OIL', 'Descrīption'=>'Oil', 'Price'=>10 ), array ( 'Code'=>'SPK', 'Descrīption'=>'Spark Plugs', 'Price'=>4 ) };
単一の値を取得したい場合は、この配列を使用する方がはるかに簡単です。説明した内容は、いわゆる最初の列に保存するよりも、それにちなんで名付けられた列に保存する方が覚えやすいことに注意してください。記述的なインデックスを使用すると、要素が [x][y] 位置に格納されることを覚えておく必要はありません。意味のある行名と列名のペアをインデックスとして使用すると、必要なデータを簡単に見つけることができます。
その場合、単純な for ループを使用して各列を順番に繰り返すことはできません。 for ループを使用して、外側の数値インデックス付き配列 $products を反復処理できます。 $products 配列の各行は、説明的なインデックスを持つ配列です。 while ループで each() 関数と list() 関数を使用すると、内部配列全体を走査できます。したがって、内部に while ループが埋め込まれた for ループが必要です。
for ( $row = 0; $row < 3; $row++ } { while ( list ( $key, $value ) = each ( $products[$row] ) ) { echo "|$value"; } echo '|<br />'; }
三维数组具有高、宽、深的概念。如果能轻松地将一个二维数组想像成一个有行和列的表格,那么就可以将三维数组想像成一堆像这样的表格。每个元素可以通过层、行和列进行引用。
根据创建多维数组的方法,可以创建四维、五维或六维数组。在PHP中,并没有设置数组维数的限制,但人们很难设想一个多于三维的数组。大多数的实际问题在逻辑上只需要使用三维或者更少维的数组结构就可以了。
多维数组的排序
对 多于一维的数组进行排序,或者不按字母和数字的顺序进行排,要复杂得多。PHP知道如何比较两个数字或字符串,但在多维数组中,每个元素都是一个数组。 PHP不知道如何比较两个数组,所以需要建立一个比较它们的方法。在大多数情况下,单词和数字的顺序是显而易见的——但对于复杂的对象,问题就会多一些。
1 用户定义排序
usort()中的“u”代表“user”,因为这个函数要求传入用户定义的比较函数。asort和ksort对应的版本uasort()和uksort()也要求传入用户定义的比较函数。
类似于asort(),当对非数字索引数组的值进行排序时,uasort()才会被使用。如果值是简单的数字或文本则可以使用asort。如果要比较的值像数组一样复杂,可以定义一个比较函数,然后使用uasort()。
类似于ksort(),当对非数字索引数组的关键字进行排序时才使用uksort()。如果值是简单的数字或文本就使用ksort。如果要比较的对象像数组一样复杂,可以定义一个比较函数,然后使用uksort()。
2 反向用户排序
函数sort()、asort()和ksort()都分别对应一个带字母“r”的反向排序函数。用户定义的排序没有反向变体,但可以对一个多维数组进行反向排序。
对数组进行重新排序
1 使用shuffle()函数
在PHP的早期版本中,shuffle()要求调用srand()函数时首先提供一个随机数生成器。如今,这个步骤已经不再需要了。
如果这个函数对你非常重要,可以在程序中应用该函数之前在服务器上测试它。
由于并不需要真正重新排序整个数组,使用array_rand()函数可以实现相同的功能。
2 使用array_reverse()函数
array_reverse()函数使用一个数组作参数,返回一个内容与参数数组相同但顺序相反的数组。
因为单独使用range()函数将创建一个升序序列,所以必须使用sort()函数或array_reverse()函数将数组中的数字变为降序。或者,也可以使用for循环通过一次一个元素的方式创建这个数组。如:
$numbers = array(); for ($i=10; $i>0; $i--) array_push( $numbers, $i );
一个for循环可以像这样按降序方式运行。可以将计数器
一个for循环可以像这样按降序方式运行。可以将计数器的初始值设为一个大数,在每次循环末尾使用运算符“--”将计数器减1。
在这里,我们创建了一个空数组,然后使用array_push()函数将每个新元素添加到数组的末尾。请注意,和array_push()相反的函数是array_pop(),这个函数用来删除并返回数组末尾的一个元素。
或者,也可以使用array_reverse()函数将由range()函数所创建的数组进行反向排序。
请注意,array_reverse()函数将返回一个原数组修改后的副本。如果不再需要原来的数组,比如在这个例子中,可以用新的副本覆盖原来的版本。
如果数据只是一系列的整数,可以通过将-1作为range()函数的第三个可选调参数,以相反的顺序创建该数组。
从文件载入数组
使用file()函数将整个文件载入一个数组中。文件中的每行则成为数组中的一个元素。使用了count()函数来统计数组中的元素个数。
explode("\t", $orders[$i])
explode()函数可以将传入的字符串分割成一个个小块。每个制表符成为两个元素之间的断点。这个函数的可选参数limit可以用来限制被返回的最大块数。
可以使用许多方法从字符串中提取数字。在这里,我们使用了intval()函数。它可以将一个字符串转化成一个整数。这个转换是相当智能化的,它可以忽略某些部分,例如标签就不能转换成数字。
执行其他的数组操作
1 在数组中浏览:each()、current()、reset()、end()、next()、pos()和prev()
前面已经提到,每个数组都有一个内部指针指向数组中的当前元素。当使用函数each()时,就间接地使用了这个指针,但是也可以直接使用和操作这个指针。
如果创建一个新数组,那么当前指针就将被初始化,并指向数组的第一个元素。
调用next()或each()将使指针前移一个元素。调用each($array_name)会在指针前移一个位置之前返回当前元素。next()函数则有些不同——调用next($array_name)是将指针前移,然后再返回新的当前元素。
调用end($array_name)可以将指针移到数组末尾。
要反向遍历一个数组,可以使用end()和prev()函数。prev()函数和next()函数相反。它是将当前指针往回移一个位置然后再返回新的当前元素。
2 对数组的每一个元素应用任何函数:array_walk()
array_walk()函数需要三个参数。第一个是arr,也就是需要处理的数组。第二个是func,也就是用户自定义并将作用于数组中每个元素的函数。第三个参数userdata是可选的,如果使用它,它可以作为一个参数传递给我们自己的函数。
看一个销微复杂点的例子:
function my_multiply(&$value, $key, $factor) { $value *= $factor; } array_walk(&$array, 'my_multiply', 3);
在这里,我们定义了一个名为my_multiply()的函数,它可以用所提供的乘法因子去乘以数组中的每个元素。
此外,还有一个需要注意的问题是传递毵数$value的方式。在my_multiply()的函数定义中,变量前面的地址符(&)意味着$value是按引用方式传递的。按引用方式传递允许函数修改数组的内容。
3 统计数组元素个数:count()、sizeof()和array_count_values()
count()函数和sizeof()函数具有同样的用途,都可以返回数组元素的个数。可以得到一个常规标量变量中的元素个数,如果传递给这个函数的数组是一个空数组,或者是一个没有经过设定的变量,返回的数组个数就是0。
如 果调用array_count_values($array),这个函数将会统计每个特定的值在数组$array中出现过的次数(这就是数组的基数集)。 这个函数将返回一个包含频率表的相关数组。这个数组包含数组$array中的所有值,并以这些值作为相关数组的关键字。每个关键字所对应的数值就是关键字 在数组$array中出现的次数。
4 将数组转换成标量变量:extract()
对于一个非数字索引数组,而该数组又有许多关键字-值对,可以使用函数extract()将它们转换成一系列的标量变量。
函数extract()的作用是通过一个数组创建一系列的标量变量,这些变量的名称必须是数组中关键字的名称,而变量值则是数组中的值。
extract()函数具有两个可选参数:extract_type和prefix。变量extract_type将告诉extract()函数如何处理冲突。有时可能已经存在一个和数组关键字同名的变量,该函数的默认操作是覆盖已有的变量。
两个最常用的选项是EXTR_OVERWRITE(默认值)和EXTR_PREFIX_ALL。当知道会发生特定的冲突并且希望跳过该关键字或要给它加上前缀时,可能会用到其他选项。
extract()可以提取出一个元素,该元素的关键字必须是一个有效的变量名称,这就意味着以数字开始或包含空格的关键字将被跳过。
以上がPHP配列の使い方まとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。