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]
Respostas:
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' => 'john@example.com'
),
1 => array(
'name' => 'Jane Doe',
'email' => 'jane@example.com'
),
);
Que é equivalente a
$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';
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);
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.
count
na dimensão certa, por exemplo count($d[1])
, a menos que eu esteja entendendo mal seu ponto?
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));
}
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.
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.
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' => '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++;
}
}
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
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.
$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
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'
]
]
]
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));
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.