2 차원 배열을 어떻게 선언합니까?


92

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 두 번째 스 니펫에서는 두 개의 반복 블록이 루프에 배치되고 숫자 인덱스는 각 반복이 증가하는 변수로 대체됩니다.
Atli

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

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 그것은 단지 의미론입니다. 실제로 두 개념은 동일합니다. 여기에서 설명하는 것과 C #과 같은 언어에서 사용되는 다차원 배열의 유일한 차이점은 구문입니다. 그리고 그 구문의 상당히 작은 차이입니다.
Atli

1
적어도 C #에서는 메모리 요구 사항이 다릅니다. 배열 배열은 각 배열에 필요한 메모리 양만 할당합니다. 2 차원 배열은 전체 N * M 메모리를 할당합니다.
dotancohen 2013 년

6
@dotancohen PHP와 C # 사이의 메모리 요구 사항은 일반적으로 매우 다릅니다. 각 언어의 런타임에는 고유 한 메모리 처리 방법이 있기 때문입니다. 일반적으로 실제로는 염려하는 것이 아닙니다. 게임과 같이 일종의 장기 실행 고성능 앱을 빌드하는 경우가 아니면 PHP는 이상한 언어 선택이 될 것입니다.
Atli

41

선언 만 하시겠습니까? 그럴 필요가 없습니다. 변수가 있는지 확인하십시오.

$d = array();

배열은 동적으로 크기가 조정되며 존재하지 않는 요소에 무엇이든 쓰려고 시도하면 생성됩니다 (필요한 경우 전체 배열 생성).

$d[1][2] = 3;

이는 사전 선언없이 모든 차원에 유효합니다.


3
치수에 대해 아무것도 알려주지 않는 한. M x N 2D 배열을 선언하는 경우 행렬 일 가능성이 있고 행렬 인 경우 곱셈을하거나 요소를 반복해야하는 무언가를 할 수 있습니다. "희소"하고 치수를 모릅니다.
cletus

@cletus : count그래도 올바른 차원에서 사용할 수 있습니다 . 예를 들어 count($d[1])제가 귀하의 요점을 오해하지 않는 한.
DisgruntledGoat

2
그래도 PHP에는 다차원 배열이 없습니다. 가능성은 항상 배열의 배열이 희소 할 수 있습니다. 따라서 배열을 사용하여 행렬을 구현하는 클래스를 만드는 것은 어떻습니까? 적어도 적절한 구현에 대해 더 많은주의를 기울일 것입니다.
Don

26

첫째, PHP에는 다차원 배열이없고 배열 배열이 있습니다.

둘째,이를 수행하는 함수를 작성할 수 있습니다.

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

2
당신은 "배열을 의미하지 않는다 대신"배열의 배열 ", 또는 배열을?"
Asaph

@Asaph : 맞아요. 결정된. 감사.
cletus

1
0 배열을 설정하는 것은 완전히 무의미한 연습입니다. 배열을 선언 할 필요없이 사용하면됩니다.
DisgruntledGoat

8
반복 해야하거나 행렬 곱셈을하는 것처럼 크기를 결정 해야하는 경우는 예외 입니다. 배열 값을 채우는 데는 완벽하게 유효한 경우가 있습니다.
cletus

11

간단한 "사용할 때 채우기"유형의 솔루션 :

$foo = array(array());

이렇게하면 $ foo [ n ] [ n ]을 저장할 수있는 유연한 의사 2 차원 배열을 얻을 수 있습니다 . 여기서 n <= ∞ (물론 일반적인 메모리 크기 제한에 의해 제한되지만 원하는 아이디어를 얻습니다). 이론적으로 이것은 필요한만큼의 서브 어레이를 생성하도록 확장 될 수 있습니다.


9

또는 모두 동일한 값을 갖는 더 큰 배열의 경우 :

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

모든 것이로 설정된 $mby $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

하나의 라이너를 사용하여 간단한 값에 대한 다차원 배열을 빠르게 생성하려면이 배열 라이브러리 를 사용하여 다음 과 같이하는 것이 좋습니다 .

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

생산할

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

0

시도해 볼 수 있지만 두 번째 차원 값은 인덱스와 동일합니다.

$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] 번째 항목과 같은를 사용 합니다. 배열 $arr[1][0]두 번째 배열에서 첫 번째 항목을 반환합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.