¿Cómo declaro una matriz bidimensional?

91

¿Cuál es la forma más sencilla de crear una matriz 2d? Esperaba poder hacer algo similar a esto:

declare int d[0..m, 0..n]
Máscara
fuente

Respuestas:

81

También puede crear una matriz asociativa, o una matriz como una "tabla hash", especificando el índice de la matriz.

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

Que es 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
fuente
1
¿Cómo podemos crear esta misma matriz usando declaraciones en bucle?
Anoop Pete
@ Anoop-Pete En el segundo fragmento, los dos bloques repetidos se colocarían en el bucle y el índice numérico se reemplazaría por una variable que se incrementa en cada iteración.
Atli
1
@AnoopPete: for ($ i = 0; $ i <cuenta ($ matriz); $ i ++) {print ($ matriz [$ i] ['nombre']); }
Dax
64

Los siguientes son equivalentes y dan como resultado una matriz bidimensional:

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

o

$array = array();

$array[] = array(0, 1, 2);
$array[] = array(3, 4, 5);
David Snabel-Caunt
fuente
7
Esos no dan como resultado matrices bidimensionales, sino que dan como resultado una matriz de matrices.
dotancohen
5
@dotancohen Eso es solo semántica, de verdad. Prácticamente los dos conceptos son iguales. La única diferencia entre lo que se demuestra allí y el tipo de matrices multidimensionales que se utilizan en lenguajes como C # es la sintaxis. Y una diferencia bastante pequeña en la sintaxis.
Atli
1
En C # al menos, los requisitos de memoria son diferentes. Una matriz de matrices asigna solo la cantidad de memoria necesaria para cada matriz. Una matriz bidimensional asigna todo el N * M de memoria.
dotancohen
6
@dotancohen Los requisitos de memoria entre PHP y C # son muy diferentes en general, ya que el tiempo de ejecución de cada lenguaje tiene su propia forma de manejar la memoria. Por lo general, no es algo que le preocupe en la práctica. No, a menos que esté creando algún tipo de aplicación de alto rendimiento y larga duración, como un juego, en cuyo caso PHP sería una elección extraña de lenguaje.
Atli
40

¿Solo declarar? No tienes que hacerlo. Solo asegúrese de que la variable exista:

$d = array();

Las matrices se redimensionan dinámicamente y el intento de escribir cualquier cosa en un elemento inexistente lo crea (y crea una matriz completa si es necesario)

$d[1][2] = 3;

Esto es válido para cualquier número de dimensiones sin declaraciones previas.

Kornel
fuente
3
Excepto que eso no te dice nada sobre las dimensiones. Si está declarando una matriz M x N 2D, es probable que sea una matriz y, si es una matriz, es probable que esté haciendo una multiplicación o algo en ella que requiera iterar sobre los elementos, lo que no puede hacer si es "escasa" y no conoce las dimensiones.
cletus
@cletus: sin embargo, puedes usarlo counten la dimensión correcta, por ejemplo count($d[1]), a menos que no esté entendiendo tu punto.
DisgruntledGoat
2
Aún así, PHP no tiene matrices multidimensionales. Siempre saldrá la posibilidad de que una matriz de matrices sea escasa. Entonces, ¿qué tal hacer una clase que implemente una matriz usando matrices? Al menos, entonces cuidaría más la implementación adecuada.
Don
26

En primer lugar, PHP no tiene matrices multidimensionales, tiene matrices de matrices.

En segundo lugar, puede escribir una función que lo haga:

function declare($m, $n, $value = 0) {
  return array_fill(0, $m, array_fill(0, $n, $value));
}
cletus
fuente
2
¿No se refiere a "matrices de matrices" en lugar de "matrices o matrices"?
Asaph
@Asaph: sí, lo hice. Fijo. Gracias.
cletus
1
Establecer una matriz de ceros es un ejercicio completamente inútil. No necesitas declarar una matriz, solo úsala.
DisgruntledGoat
7
Excepto si necesita iterar sobre él o determinar su tamaño, como si estuviera haciendo una multiplicación de matrices. Existe un caso perfectamente válido para llenar los valores de la matriz.
Cletus
11

Para un tipo de solución simple, "llenar sobre la marcha":

$foo = array(array());

Esto le dará una matriz pseudo bidimensional flexible que puede contener $ foo [ n ] [ n ] donde n <= ∞ (por supuesto, está limitado por las limitaciones habituales del tamaño de la memoria, pero espero que entienda la idea). Esto podría, en teoría, extenderse para crear tantas submatrices como necesite.

Kingsolmn
fuente
9

O para matrices más grandes, todas con el mismo valor:

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

creará una matriz $mby $ncon todo configurado en $value.

Ámbar
fuente
3

Hasta donde yo sé, no hay una función php incorporada para hacer esto, debe hacerlo a través de un bucle o mediante un método personalizado que llame de forma recursiva a algo como array_fill indicado en la respuesta de @Amber;

Supongo que te refieres a crear una matriz de matrices vacía pero inicializada. Por ejemplo, desea un resultado final como el siguiente de una matriz de 3 matrices :

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

Esto es simple de codificar a mano, pero para una matriz de tamaño arbitrario como una matriz de 3 matrices de 3 matrices , comienza a ser complejo inicializar antes de usar:

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

... etc ...

Me da frustración. Sería bueno tener una manera fácil de declarar una matriz inicializada de matrices de cualquier profundidad para usar sin verificar ni arrojar errores.

Rayo
fuente
3

La respuesta de atli realmente me ayudó a entender esto. Aquí hay un ejemplo de cómo iterar a través de una matriz bidimensional. Este ejemplo muestra cómo encontrar valores para nombres conocidos de una matriz y también un foreach donde simplemente pasa por todos los campos que encuentra allí. Espero que esto ayude a alguien.

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

Salidas:

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
fuente
2

Y para mí, el argumento sobre si una matriz debe ser escasa o no depende del contexto.

Por ejemplo, si $ a [6] [9] no se completa, es equivalente a $ a [6] [9] que se completa, por ejemplo, con "" o 0.

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

para hacer eco de un solo elemento de matriz, debe escribir:

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

la salida sería: arr1 arr2

Deshal Kh
fuente
2
Esta es una matriz unidimensional. Una matriz multidimensional tiene al menos una matriz dentro de una matriz.
Mike Stratton
2

Y me gusta de esta manera:

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

Si desea crear rápidamente una matriz multidimensional para obtener un valor simple usando un trazador de líneas, le recomendaría usar esta biblioteca de matriz para hacerlo así:

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

que producirá

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

Puede intentar esto, pero los valores de la segunda dimensión serán iguales a los índices:

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

un poco más complicado para una matriz vacía:

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

Denis Ivanov
fuente
0

Necesita declarar una matriz en otra matriz.

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

Ejemplo:

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

Para obtener el primer elemento de la matriz, usará $arr[0][0], que es como el primer elemento de la primera matriz de la matriz. $arr[1][0]devolverá el primer elemento de la segunda matriz de la matriz.

mmateas
fuente