Comment déclarer un tableau à deux dimensions?

91

Quelle est la manière la plus simple de créer un tableau 2D. J'espérais pouvoir faire quelque chose de similaire à ceci:

declare int d[0..m, 0..n]
Masque
la source

Réponses:

81

Vous pouvez également créer un tableau associatif, ou un tableau de type «table de hachage», en spécifiant l'index du tableau.

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

Ce qui équivaut à

$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
la source
1
Comment pouvons-nous créer ce même tableau en utilisant des instructions en boucle?
Anoop Pete
@ Anoop-Pete Dans le deuxième extrait de code, les deux blocs répétitifs seraient placés dans la boucle et l'index numérique remplacé par une variable incrémentée à chaque itération.
Atli
1
@AnoopPete: for ($ i = 0; $ i <count ($ array); $ i ++) {print ($ array [$ i] ['name']); }
Dax
64

Les éléments suivants sont équivalents et donnent un tableau à deux dimensions:

$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
la source
7
Ceux-ci n'aboutissent pas à des tableaux à deux dimensions, mais plutôt à un tableau de tableaux.
dotancohen
5
@dotancohen C'est juste de la sémantique, vraiment. Pratiquement, les deux concepts sont les mêmes. La seule différence entre ce qui y est démontré et le type de tableaux multidimensionnels utilisés dans des langages comme C # est la syntaxe. Et une assez petite différence de syntaxe à cela.
Atli le
1
Au moins en C #, les besoins en mémoire sont différents. Un tableau de tableaux alloue uniquement la quantité de mémoire nécessaire pour chaque tableau. Un tableau bidimensionnel alloue la totalité des N * M de mémoire.
dotancohen
6
@dotancohen Les besoins en mémoire entre PHP et C # sont très différents en général, car le runtime de chaque langage a sa propre façon de gérer la mémoire. Ce n'est généralement pas quelque chose qui vous préoccupe dans la pratique. Pas à moins que vous ne construisiez une sorte d'application de longue durée et haute performance, comme un jeu, auquel cas PHP serait un choix étrange de langue.
Atli le
40

Déclarez-vous? Vous n'êtes pas obligé. Assurez-vous simplement que la variable existe:

$d = array();

Les tableaux sont redimensionnés dynamiquement et tentent d'écrire quoi que ce soit sur un élément non existant le crée (et crée un tableau entier si nécessaire)

$d[1][2] = 3;

Ceci est valable pour n'importe quel nombre de dimensions sans déclaration préalable.

Kornel
la source
3
Sauf que cela ne vous dit rien sur les dimensions. Si vous déclarez un tableau 2D M x N, il y a de fortes chances que ce soit une matrice et si c'est une matrice, il y a de fortes chances que vous fassiez une multiplication ou quelque chose dessus qui nécessitera une itération sur les éléments, ce que vous ne pouvez pas faire si c'est "clairsemée" et je ne connais pas les dimensions.
cletus
@cletus: vous pouvez simplement utiliser countla bonne dimension, par exemple count($d[1]), à moins que je ne comprenne mal votre point?
DisgruntledGoat
2
Pourtant, PHP n'a pas de tableaux multidimensionnels. La possibilité se terminera toujours qu'un tableau de tableaux soit clairsemé. Alors, que diriez-vous de créer une classe qui implémente une matrice à l'aide de tableaux, au moins, vous feriez plus attention à une implémentation correcte.
Don
26

Premièrement, PHP n'a pas de tableaux multidimensionnels, il a des tableaux de tableaux.

Deuxièmement, vous pouvez écrire une fonction qui le fera:

function declare($m, $n, $value = 0) {
  return array_fill(0, $m, array_fill(0, $n, $value));
}
cletus
la source
2
Ne voulez-vous pas dire "tableaux de tableaux", au lieu de "tableaux ou tableaux"?
Asaph
@Asaph: oui je l'ai fait. Fixé. Merci.
cletus
1
Mettre en place un tableau de zéros est un exercice totalement inutile. Vous n'avez pas besoin de déclarer un tableau, utilisez-le simplement.
DisgruntledGoat
7
Sauf si vous avez besoin de le parcourir ou de déterminer sa taille, comme si vous disiez faire une multiplication matricielle. Il existe un cas parfaitement valide pour remplir les valeurs du tableau.
cletus
11

Pour une solution simple, "remplir au fur et à mesure":

$foo = array(array());

Cela vous donnera un pseudo tableau bidimensionnel flexible qui peut contenir $ foo [ n ] [ n ] où n <= ∞ (bien sûr, vous êtes limité par les contraintes habituelles de la taille de la mémoire, mais vous avez l'idée que j'espère). Cela pourrait, en théorie, être étendu pour créer autant de sous-tableaux que vous en avez besoin.

Kingsolmn
la source
9

Ou pour des tableaux plus grands, tous avec la même valeur:

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

créera un tableau $mby $navec tout défini sur $value.

ambre
la source
3

Autant que je sache, il n'y a pas de fonction php intégrée pour faire cela, vous devez le faire via une boucle ou via une méthode personnalisée qui appelle récursivement quelque chose comme array_fill indiqué dans la réponse par @Amber;

Je suppose que vous voulez dire créé un tableau vide mais initialisé de tableaux. Par exemple, vous voulez un résultat final comme celui ci-dessous d'un tableau de 3 tableaux :

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

C'est simple à utiliser du code, mais pour un tableau de taille arbitraire comme un tableau de 3 tableaux de 3 tableaux, il commence à devenir complexe à initialiser avant utilisation:

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

...etc...

J'ai la frustration. Ce serait bien d'avoir un moyen simple de déclarer un tableau initialisé de tableaux de n'importe quelle profondeur à utiliser sans vérifier ni lancer d'erreurs.

Rayon
la source
3

La réponse de atli m'a vraiment aidé à comprendre cela. Voici un exemple d'itération dans un tableau à deux dimensions. Cet exemple montre comment rechercher des valeurs pour les noms connus d'un tableau et également un foreach où vous parcourez simplement tous les champs que vous y trouvez. J'espère que cela aide quelqu'un.

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

Les sorties:

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
la source
2

Et pour moi, l'argument de savoir si un tableau doit être clairsemé ou non dépend du contexte.

Par exemple, si $ a [6] [9] n'est pas renseigné, cela équivaut à $ a [6] [9] renseigné par exemple avec "" ou 0.

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

pour faire écho à un seul élément du tableau, vous devez écrire:

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

la sortie serait: arr1 arr2

Deshal Kh
la source
2
Il s'agit d'un tableau unidimensionnel. Un tableau multidimensionnel a au moins un tableau dans un tableau.
Mike Stratton
2

Et j'aime cette façon:

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

Si vous voulez créer rapidement un tableau multidimensionnel pour une valeur simple en utilisant une seule doublure, je vous recommande d'utiliser cette bibliothèque de tableaux pour le faire comme ceci:

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

qui produira

[
  1 => [
    2 => [
      3 => 'value'
    ]
  ]
]
Minwork
la source
0

Vous pouvez essayer ceci, mais les valeurs de la deuxième dimension seront égales aux index:

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

un peu plus compliqué pour un tableau vide:

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

Denis Ivanov
la source
0

Vous devez déclarer un tableau dans un autre tableau.

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

Exemple:

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

Pour obtenir le premier élément du tableau, vous utiliserez $arr[0][0], c'est comme le premier élément du premier tableau du tableau. $arr[1][0]renverra le premier élément du deuxième tableau du tableau.

mmateas
la source