2次元配列を宣言するにはどうすればよいですか?


91

2D配列を作成する最も簡単な方法は何ですか。私はこれに似たことができることを望んでいました:

declare int d[0..m, 0..n]

回答:


81

配列のインデックスを指定することにより、連想配列、または「ハッシュテーブル」のような配列を作成することもできます。

$array = array(
    0 => array(
        'name' => 'John Doe',
        'email' => 'john@example.com'
    ),
    1 => array(
        'name' => 'Jane Doe',
        'email' => 'jane@example.com'
    ),
);

これは

$array = array();

$array[0] = array();
$array[0]['name'] = 'John Doe';
$array[0]['email'] = 'john@example.com';

$array[1] = array();
$array[1]['name'] = 'Jane Doe';
$array[1]['email'] = 'jane@example.com';

1
ループステートメントを使用して、この同じ配列をどのように作成できますか?
Anoop Pete

@ Anoop-Pete 2番目のスニペットでは、2つの繰り返しブロックがループに配置され、数値インデックスが、反復ごとに増分される変数に置き換えられます。
Atli

1
@AnoopPete:for($ i = 0; $ i <count($ array); $ i ++){print($ array [$ i] ['name']); }
Dax

64

以下は同等であり、2次元配列になります。

$array = array(
    array(0, 1, 2),
    array(3, 4, 5),
);

または

$array = array();

$array[] = array(0, 1, 2);
$array[] = array(3, 4, 5);

7
これらの結果は2次元配列ではなく、配列の配列になります。
dotancohen 2012

5
@dotancohenそれはまさに意味論です。実際には、2つの概念は同じです。そこで示されているものと、C#などの言語で使用されている多次元配列の種類との唯一の違いは構文です。そして、その構文のわずかな違い。
Atli

1
少なくともC#では、メモリ要件は異なります。配列の配列は、各配列に必要なメモリ量のみを割り当てます。2次元配列は、N * Mのメモリ全体を割り当てます。
dotancohen 2013

6
@dotancohen各言語のランタイムには独自のメモリ処理方法があるため、PHPとC#間のメモリ要件は一般に大きく異なります。これは通常、実際には関係のないことです。ゲームのようなある種の長時間実行する高性能アプリをたまたま作成しているのでなければ、PHPは言語の奇妙な選択になるでしょう。
Atli 2014

40

宣言するだけ?する必要はありません。変数が存在することを確認してください:

$d = array();

配列は動的にサイズ変更され、存在しない要素に何かを書き込もうとするとそれが作成されます(必要に応じて配列全体が作成されます)

$d[1][2] = 3;

これは、事前の宣言のない任意の数の次元に有効です。


3
ただし、寸法については何もわかりません。M x N 2D配列を宣言している場合、それは行列である可能性があり、それが行列である場合は、要素での乗算または要素の反復を必要とする何かを実行している可能性があります。 「スパース」で、寸法がわかりません。
cletus 2009年

@cletus:でもcount、たとえばcount($d[1])、私があなたのポイントを誤解していない限り、正しい次元で使用できますか?
DisgruntledGoat

2
それでも、PHPには多次元配列はありません。配列の配列がまばらである可能性は常に存在します。したがって、配列を使用して行列を実装するクラスを作成するのはどうでしょうか。少なくとも、適切な実装を行う必要があります。
ドン

26

まず、PHPには多次元配列がなく、配列の配列があります。

次に、それを行う関数を書くことができます:

function declare($m, $n, $value = 0) {
  return array_fill(0, $m, array_fill(0, $n, $value));
}

2
「配列または配列」の代わりに「配列配列」を意味するのではないですか?
Asaph

@Asaph:はい、そうしました。修繕。ありがとう。
cletus 2009年

1
ゼロの配列を設定することは、完全に無意味な練習です。配列を宣言する必要はありません。使用するだけです。
DisgruntledGoat

7
それを反復する必要がある場合や、行列の乗算を行う場合と同じようにサイズを決定する必要がある場合を除きます。配列の値を入力するための完全に有効なケースがあります。
cletus 2009年

11

単純な「そのまま入力する」種類のソリューションの場合:

$foo = array(array());

これにより、$ foo [ n ] [ n ] を保持できる柔軟な疑似2次元配列が得られます。ここで、n <=∞(もちろん、通常のメモリサイズの制限によって制限されますが、私が望むアイデアが得られます)。理論的には、これを拡張して必要な数のサブ配列を作成できます。


9

または、すべて同じ値の大きな配列の場合:

$m_by_n_array = array_fill(0, $n, array_fill(0, $m, $value);

すべてがに設定さ$mれた$n配列で作成され$valueます。


3

これを行うための組み込みのphp関数がないことを私が知っている限り、ループまたは@Amberによる回答でinidcatedされたarray_fillのようなものを再帰的に呼び出すカスタムメソッドを介して行う必要があります。

私はあなたが空であるが初期化された配列の配列を作成したという意味だと思います。たとえば、次のような3つの配列の配列の最終的な結果が必要です。

   $final_array = array(array(), array(), array());

これはコードを手作業で書くのは簡単ですが、3つの配列の3つの配列の配列のような任意のサイズの配列の場合、使用前に初期化するのが複雑になります。

     $final_array = array(array(array(), array(), array()), array(array(), array(), array()), array(array(), array(), array()));

...等...

欲求不満を感じる。エラーをチェックしたりスローしたりせずに、初期化された配列の配列を任意の深さで宣言する簡単な方法があると便利です。


3

atliの回答は、これを理解するのに本当に役立ちました。2次元配列を反復処理する方法の例を次に示します。このサンプルは、配列の既知の名前の値を見つける方法と、そこにあるすべてのフィールドをたどるforeachを見つける方法を示しています。誰かのお役に立てば幸いです。

$array = array(
    0 => array(
        'name' => 'John Doe',
        'email' => 'john@example.com'
    ),
    1 => array(
        'name' => 'Jane Doe',
        'email' => 'jane@example.com'
    ),
);

foreach ( $array  as $groupid => $fields) {
    echo "hi element ". $groupid . "\n";
    echo ". name is ". $fields['name'] . "\n";
    echo ". email is ". $fields['email'] . "\n";
    $i = 0;
    foreach ($fields as $field) {
         echo ". field $i is ".$field . "\n";
        $i++;
    }
}

出力:

hi element 0
. name is John Doe
. email is john@example.com
. field 0 is John Doe
. field 1 is john@example.com
hi element 1
. name is Jane Doe
. email is jane@example.com
. field 0 is Jane Doe
. field 1 is jane@example.com

2

そして私にとって、配列をスパースにするべきかどうかについての議論はコンテキストに依存します。

たとえば、$ a [6] [9]が入力されていない場合は、$ a [6] [9]に ""または0などが入力されているのと同じです。


2
$r = array("arr1","arr2");

単一の配列要素をエコーするには、次のように記述します。

echo $r[0];
echo $r[1];

出力は次のようになります: arr1 arr2


2
これは1次元配列です。多次元配列には、少なくとも配列内の配列があります。
Mike Stratton

2

そして私はこのように好きです:

$cars = array
  (
  array("Volvo",22),
  array("BMW",15),
  array("Saab",5),
  array("Land Rover",17)
  );

0

1つのライナーを使用して単純な値の多次元配列をすばやく作成する場合は、この配列ライブラリを使用して次のようにすることをお勧めします。

$array = Arr::setNestedElement([], '1.2.3', 'value');

生成されます

[
  1 => [
    2 => [
      3 => 'value'
    ]
  ]
]

0

これを試すことができますが、2番目の次元の値はインデックスと等しくなります。

$array = array_fill_keys(range(0,5), range(0,5));

空の配列の場合はもう少し複雑です:

$array = array_fill_keys(range(0, 5), array_fill_keys(range(0, 5), null));


0

配列を別の配列で宣言する必要があります。

$arr = array(array(content), array(content));

例:

$arr = array(array(1,2,3), array(4,5,6));

配列の最初の項目を取得するには、を使用します。これは、配列の最初の配列の$arr[0][0]最初の項目と同じです。 配列の2番目の配列の最初の項目を返します。$arr[1][0]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.