Come dichiaro un array bidimensionale?


91

Qual è il modo più semplice per creare un array 2d. Speravo di poter fare qualcosa di simile a questo:

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

Risposte:


81

È anche possibile creare un array associativo, o un array simile a una "tabella hash", specificando l'indice dell'array.

$array = array(
    0 => array(
        'name' => 'John Doe',
        'email' => 'john@example.com'
    ),
    1 => array(
        'name' => 'Jane Doe',
        'email' => 'jane@example.com'
    ),
);

Che è 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';

1
Come possiamo creare questo stesso array usando istruzioni in loop?
Anoop Pete

@ Anoop-Pete Nel secondo frammento i due blocchi ripetuti sarebbero stati inseriti nel ciclo e l'indice numerico sostituito da una variabile che viene incrementata ad ogni iterazione.
Atli

1
@AnoopPete: for ($ i = 0; $ i <count ($ array); $ i ++) {print ($ array [$ i] ['nome']); }
Dax

64

I seguenti sono equivalenti e danno come risultato un array bidimensionale:

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

o

$array = array();

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

7
Quelli non danno come risultato array bidimensionali, ma piuttosto un array di array.
dotancohen

5
@dotancohen Questa è solo semantica, davvero. Praticamente i due concetti sono gli stessi. L'unica differenza tra ciò che viene illustrato e il tipo di array multidimensionali utilizzati in linguaggi come C # è la sintassi. E una differenza abbastanza piccola nella sintassi.
Atli

1
Almeno in C #, i requisiti di memoria sono diversi. Un array di array alloca solo la quantità di memoria necessaria per ogni array. Un array bidimensionale alloca l'intero N * M di memoria.
dotancohen

6
@dotancohen I requisiti di memoria tra PHP e C # sono molto diversi in generale, poiché il runtime di ogni linguaggio ha il proprio modo di gestire la memoria. In genere non è qualcosa che ti interessa nella pratica. No, a meno che non ti capiti di costruire una sorta di app di lunga durata e ad alte prestazioni, come un gioco, nel qual caso PHP sarebbe una strana scelta di una lingua.
Atli

40

Dichiarare e basta? Non devi. Assicurati solo che la variabile esista:

$d = array();

Gli array vengono ridimensionati dinamicamente e il tentativo di scrivere qualsiasi cosa su un elemento non esistente lo crea (e crea l'intero array se necessario)

$d[1][2] = 3;

Ciò è valido per qualsiasi numero di dimensioni senza preventiva dichiarazione.


3
Tranne che non ti dice nulla sulle dimensioni. Se stai dichiarando un array 2D M x N, è probabile che sia una matrice e se è una matrice è probabile che tu stia eseguendo la moltiplicazione o qualcosa su di essa che richiederà l'iterazione sugli elementi, cosa che non puoi fare se è "sparse" e non conosco le dimensioni.
cletus

@cletus: puoi usarlo solo countsulla dimensione giusta, ad esempio count($d[1]), a meno che io non abbia frainteso il tuo punto?
Capra contrariata

2
Tuttavia, PHP non ha array multidimensionali. Esisterà sempre la possibilità che un array di array possa essere sparso. Quindi, che ne dici di creare una classe che implementa una matrice usando gli array, almeno allora ti prenderesti più cura della corretta implementazione.
Don

26

In primo luogo, PHP non ha array multidimensionali, ha array di array.

In secondo luogo, puoi scrivere una funzione che lo farà:

function declare($m, $n, $value = 0) {
  return array_fill(0, $m, array_fill(0, $n, $value));
}

2
Non intendi "array di array", invece di "array o array"?
Asaf

@ Asaf: sì l'ho fatto. Fisso. Grazie.
cletus

1
Impostare un array di zeri è un esercizio completamente inutile. Non è necessario dichiarare un array, basta usarlo.
Capra contrariata

7
Tranne se hai bisogno di iterare su di esso o determinare la sua dimensione come se dicessi di fare la moltiplicazione di matrici. C'è un caso perfettamente valido per riempire i valori dell'array.
cletus

11

Per una soluzione semplice, "riempi man mano":

$foo = array(array());

Questo ti darà un array pseudo bidimensionale flessibile che può contenere $ foo [ n ] [ n ] dove n <= ∞ (ovviamente sei limitato dai soliti vincoli della dimensione della memoria, ma spero che tu abbia l'idea). Questo potrebbe, in teoria, essere esteso per creare tutti i sotto array di cui hai bisogno.


9

O per array più grandi, tutti con lo stesso valore:

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

creerà un array $mby $ncon tutto impostato su $value.


3

Per quanto ne so non esiste una funzione php incorporata per farlo, è necessario farlo tramite un ciclo o tramite un metodo personalizzato che richiama in modo ricorsivo qualcosa come array_fill indicato nella risposta da @Amber;

Suppongo che tu intenda creare un array di array vuoto ma inizializzato. Ad esempio, vuoi un risultato finale come il seguente di un array di 3 array :

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

Si tratta di un semplice codice manuale, ma per un array di dimensioni arbitrarie come un array di 3 array di 3 array , inizia a diventare complesso inizializzare prima dell'uso:

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

...eccetera...

Ottengo la frustrazione. Sarebbe bello avere un modo semplice per dichiarare un array di array inizializzato di qualsiasi profondità da usare senza controllare o generare errori.


3

La risposta di atli mi ha davvero aiutato a capire questo. Ecco un esempio di come iterare attraverso una matrice bidimensionale. Questo esempio mostra come trovare i valori per i nomi noti di un array e anche un foreach in cui devi semplicemente passare attraverso tutti i campi che trovi lì. Spero che aiuti qualcuno.

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

Uscite:

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

E per me l'argomento sul fatto che un array debba essere sparso o meno dipende dal contesto.

Ad esempio, se $ a [6] [9] non è popolato equivale a $ a [6] [9] essere popolato ad esempio con "" o 0.


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

per riprodurre un singolo elemento dell'array dovresti scrivere:

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

l'output sarebbe: arr1 arr2


2
Questa è una matrice unidimensionale. Un array multidimensionale ha come minimo un array all'interno di un array.
Mike Stratton

2

E mi piace così:

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

0

Se vuoi creare rapidamente un array multidimensionale per un valore semplice usando un liner, ti consiglio di usare questa libreria di array per farlo in questo modo:

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

che produrrà

[
  1 => [
    2 => [
      3 => 'value'
    ]
  ]
]

0

Puoi provare questo, ma i valori della seconda dimensione saranno uguali agli indici:

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

un po 'più complicato per un array vuoto:

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


0

È necessario dichiarare un array in un altro array.

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

Esempio:

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

Per ottenere il primo elemento dall'array, utilizzerai $arr[0][0], che è come il primo elemento dal primo array dell'array. $arr[1][0]restituirà il primo elemento dal secondo array dall'array.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.