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]

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' => 'john@example.com'
    ),
    1 => array(
        'name' => 'Jane Doe',
        'email' => 'jane@example.com'
    ),
);

Ce qui équivaut à

$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
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);

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.


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

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.


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.


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.


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

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

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.


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


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)
  );

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'
    ]
  ]
]

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));


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.