Como declaro uma matriz bidimensional?

91

Qual é a maneira mais fácil de criar um array 2d. Eu esperava ser capaz de fazer algo semelhante a isto:

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

Respostas:

81

Você também pode criar um array associativo, ou um array do tipo "tabela hash", especificando o índice do array.

$array = array(
    0 => array(
        'name' => 'John Doe',
        'email' => '[email protected]'
    ),
    1 => array(
        'name' => 'Jane Doe',
        'email' => '[email protected]'
    ),
);

Que é equivalente a

$array = array();

$array[0] = array();
$array[0]['name'] = 'John Doe';
$array[0]['email'] = '[email protected]';

$array[1] = array();
$array[1]['name'] = 'Jane Doe';
$array[1]['email'] = '[email protected]';
Atli
fonte
1
Como podemos criar esse mesmo array usando instruções em loop?
Anoop Pete
@ Anoop-Pete No segundo fragmento, os dois blocos repetidos seriam colocados no loop e o índice numérico substituído por uma variável que é incrementada a cada iteração.
Atli
1
@AnoopPete: for ($ i = 0; $ i <count ($ array); $ i ++) {print ($ array [$ i] ['nome']); }
Dax
64

Os itens a seguir são equivalentes e resultam em uma matriz bidimensional:

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

ou

$array = array();

$array[] = array(0, 1, 2);
$array[] = array(3, 4, 5);
David Snabel-Caunt
fonte
7
Eles não resultam em matrizes bidimensionais, mas sim em uma matriz de matrizes.
dotancohen
5
@dotancohen Isso é apenas semântica, na verdade. Praticamente os dois conceitos são iguais. A única diferença entre o que é demonstrado lá e o tipo de arrays multidimensionais usados ​​em linguagens como C # é a sintaxe. E uma diferença bastante pequena na sintaxe.
Atli
1
Pelo menos em C #, os requisitos de memória são diferentes. Uma matriz de matrizes aloca apenas a quantidade de memória necessária para cada matriz. Uma matriz bidimensional aloca todo o N * M de memória.
dotancohen
6
@dotancohen Os requisitos de memória entre PHP e C # são muito diferentes em geral, já que o tempo de execução de cada linguagem tem sua própria maneira de lidar com a memória. Geralmente, não é algo que o preocupa na prática. A menos que você esteja construindo algum tipo de aplicativo de longa duração e alto desempenho, como um jogo, caso em que PHP seria uma escolha estranha de linguagem.
Atli
40

Apenas declarar? Você não precisa. Apenas certifique-se de que a variável existe:

$d = array();

Os arrays são redimensionados dinamicamente e a tentativa de escrever qualquer coisa em um elemento não existente o cria (e cria o array inteiro, se necessário)

$d[1][2] = 3;

Isso é válido para qualquer número de dimensões sem declarações anteriores.

Kornel
fonte
3
Exceto que isso não diz nada sobre as dimensões. Se você está declarando um array 2D M x N, as chances são de que seja uma matriz e se for uma matriz, as chances são de que você estará fazendo multiplicação ou algo nela que necessitará de iteração sobre os elementos, o que você não pode fazer se for "esparso" e não conhece as dimensões.
cletus
@cletus: você pode usar apenas countna dimensão certa, por exemplo count($d[1]), a menos que eu esteja entendendo mal seu ponto?
DisgruntledGoat
2
Ainda assim, o PHP não tem arrays multidimensionais. Sempre haverá a possibilidade de que uma matriz de matrizes seja esparsa. Então, que tal fazer uma classe que implemente uma matriz usando arrays, pelo menos você tomaria mais cuidado com a implementação adequada.
Don
26

Em primeiro lugar, o PHP não tem arrays multidimensionais, ele tem arrays de arrays.

Em segundo lugar, você pode escrever uma função que fará isso:

function declare($m, $n, $value = 0) {
  return array_fill(0, $m, array_fill(0, $n, $value));
}
cletus
fonte
2
Você não quer dizer "arrays of arrays", em vez de "arrays ou arrays"?
Asaph
@Asaph: sim, eu fiz. Fixo. Obrigado.
cletus
1
Configurar um array de zeros é um exercício completamente inútil. Você não precisa declarar um array, apenas use-o.
DisgruntledGoat
7
Exceto se você precisar iterar sobre ele ou determinar seu tamanho, como se estivesse fazendo multiplicação de matrizes. Existe um caso perfeitamente válido para preencher os valores do array.
cletus
11

Para um tipo de solução simples, "preencha conforme você vai":

$foo = array(array());

Isso lhe dará um array pseudo-bidimensional flexível que pode conter $ foo [ n ] [ n ] onde n <= ∞ (é claro que você está limitado pelas restrições usuais de tamanho de memória, mas você entendeu, espero). Isso poderia, em teoria, ser estendido para criar quantas submatrizes forem necessárias.

Kingsolmn
fonte
9

Ou para matrizes maiores, todas com o mesmo valor:

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

criará um array $mby $ncom tudo definido como $value.

Âmbar
fonte
3

Até onde eu sei, não existe uma função php embutida para fazer isso, você precisa fazer isso por meio de um loop ou de um método personalizado que chama recursivamente para algo como array_fill indicado na resposta por @Amber;

Estou assumindo que você quer dizer criou uma matriz vazia, mas inicializada de matrizes. Por exemplo, você deseja resultados finais como os abaixo de uma matriz de 3 matrizes :

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

Isso é simples de codificar manualmente, mas para uma matriz de tamanho arbitrário como uma matriz de 3 matrizes de 3 matrizes começa a ficar complexo para inicializar antes de usar:

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

... etc ...

Eu entendo a frustração. Seria bom ter uma maneira fácil de declarar um array inicializado de arrays de qualquer profundidade para usar sem verificar ou lançar erros.

Raio
fonte
3

A resposta de Atli realmente me ajudou a entender isso. Aqui está um exemplo de como iterar em uma matriz bidimensional. Este exemplo mostra como encontrar valores para nomes conhecidos de uma matriz e também um foreach onde você simplesmente percorre todos os campos que encontra lá. Eu espero que isso ajude alguém.

$array = array(
    0 => array(
        'name' => 'John Doe',
        'email' => '[email protected]'
    ),
    1 => array(
        'name' => 'Jane Doe',
        'email' => '[email protected]'
    ),
);

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++;
    }
}

Saídas:

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
James Burnett
fonte
2

E, para mim, o argumento sobre se um array deve ser esparso ou não depende do contexto.

Por exemplo, se $ a [6] [9] não for preenchido é o equivalente a $ a [6] [9] sendo preenchido com, por exemplo, "" ou 0.

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

para ecoar um único elemento da matriz, você deve escrever:

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

a saída seria: arr1 arr2

Deshal Kh
fonte
2
Esta é uma matriz unidimensional. Uma matriz multidimensional tem, no mínimo, uma matriz dentro de uma matriz.
Mike Stratton
2

E eu gosto assim:

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

Se você deseja criar rapidamente um array multidimensional para um valor simples usando um liner, eu recomendaria usar esta biblioteca de array para fazer assim:

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

que irá produzir

[
  1 => [
    2 => [
      3 => 'value'
    ]
  ]
]
Minwork
fonte
0

Você pode tentar isso, mas os valores da segunda dimensão serão iguais aos índices:

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

um pouco mais complicado para array vazio:

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

Denis Ivanov
fonte
0

Você precisa declarar uma matriz em outra matriz.

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

Exemplo:

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

Para obter o primeiro item do array, você usará $arr[0][0], que é como o primeiro item do primeiro array do array. $arr[1][0]retornará o primeiro item da segunda matriz da matriz.

Mmateas
fonte