2013-05-09 17 views
5

Sto cercando di capire meglio gli array. Perdonate le mie domande elementari mentre ho appena aperto il mio primo libro php tre settimane fa.Accesso alle parti dell'array

Capisco che è possibile recuperare coppie chiave/valore utilizzando un ciclo foreach (o for) come di seguito.

$stockprices= array("Google"=>"800", "Apple"=>"400", "Microsoft"=>"4", "RIM"=>"15", "Facebook"=>"30"); 

foreach ($stockprices as $key =>$price) 

Cosa mi confondo circa sono multi array bidimensionali come questo:

$states=(array([0]=>array("capital"=> "Sacramento", "joined_union"=>1850, "population_rank"=> 1), 
       [1]=>array("capital"=> "Austin", "joined_union"=>1845,"population_rank"=> 2), 
       [2]=>array("capital"=> "Boston", "joined_union"=>1788,"population_rank"=> 14) 
      )); 

mia prima domanda è veramente di base: Lo so che "il capitale', 'joined_union', 'population_rank' sono le chiavi e "Sacramento", "1850", "1" sono valori (corretto?). Ma come si chiama [0] [1] [2]? Sono chiavi secondarie "chiavi principali" e "maiuscole" ecc.? Non riesco a trovare alcuna definizione per quelli, né nei libri né online

La domanda principale è come recuperare gli array [0] [1] [2]? Dire che voglio ottenere la matrice che unisce_union nel 1845 (o anche più complicata durante il 1800), quindi rimuove quella matrice.

Infine, posso denominare Array [0] [1] [2] come California, Texas e Massachusetts corrispondentemente?

$states=(array("California"=>array("capital"=> "Sacramento", "joined_union"=>1850, "population_rank"=> 1), 
       "Texas"=>array("capital"=> "Austin", "joined_union"=>1845,"population_rank"=> 2), 
       "Massachusetts"=>array("capital"=> "Boston", "joined_union"=>1788,"population_rank"=> 14) 
      )); 
+1

Un modo molto più pulito è utilizzare gli oggetti. Leggi su [object oriented PHP] (http://php.net/manual/en/language.oop5.php) e puoi evitare la "matrice-mania". – CodeZombie

+2

Diventa più facile riconoscere il percorso di accesso se rientri più facilmente il tuo codice, o guarda una [versione print_r'] (http://array.include-once.org/?foreach=1&assoc=1&json=%5B% 7B% 22capital% 22% 3A% 22Sacramento% 22% 2C% 22joined_union% 22% 3A1850% 2C% 22population_rank% 22% 3A1% 7D% 2C% 7B% 22capital% 22% 3A% 22Austin% 22% 2C% 22joined_union% 22% 3A1845% 2C% 22population_rank% 22% 3A2% 7D% 2C% 7B% 22capital% 22% 3A% 22Boston% 22% 2C% 22joined_union% 22% 3A1788% 2C% 22population_rank% 22% 3A14% 7D% 5D% 0D% 0A) . Infatti, le "chiavi principali" o talvolta i tasti di livello "top-level" sono denominazioni comuni. – mario

+1

Mentre ho risposto di seguito per aiutarvi a capire meglio gli array - che è importante ... A lungo termine, sono d'accordo con @ZombieHunter - più complesso si ottiene con gli array, più probabilmente si vorrà orientarsi agli oggetti. –

risposta

1

A differenza di altri linguaggi, gli array in PHP possono utilizzare chiavi numeriche o stringa. Tu scegli. (Questa non è una caratteristica molto amato di PHP e altri linguaggi sghignazzare!)

$states = array(
    "California" => array(
     "capital"   => "Sacramento", 
     "joined_union" => 1850, 
     "population_rank" => 1 
    ), 
    "Texas"   => array(
     "capital"   => "Austin", 
     "joined_union" => 1845, 
     "population_rank" => 2 
    ), 
    "Massachusetts" => array(
     "capital"   => "Boston", 
     "joined_union" => 1788, 
     "population_rank" => 14 
    ) 
); 

Per quanto riguarda l'interrogazione la struttura che hai, ci sono due modi
1) Looping

$joined1850_loop = array(); 
foreach($states as $stateName => $stateData) { 
    if($stateData['joined_union'] == 1850) { 
     $joined1850_loop[$stateName] = $stateData; 
    } 
} 
print_r($joined1850_loop); 
/* 
Array 
(
    [California] => Array 
     (
      [capital] => Sacramento 
      [joined_union] => 1850 
      [population_rank] => 1 
     ) 

) 
*/ 

2) utilizzando la funzione array_filter:

$joined1850 = array_filter(
    $states, 
    function($state) { 
     return $state['joined_union'] == 1850; 
    } 
); 
print_r($joined1850); 
/* 
Array 
(
    [California] => Array 
     (
      [capital] => Sacramento 
      [joined_union] => 1850 
      [population_rank] => 1 
     ) 

) 
*/ 

-

012.
$joined1800s = array_filter(
    $states, 
    function ($state){ 
     return $state['joined_union'] >= 1800 && $state['joined_union'] < 1900; 
    } 
); 
print_r($joined1800s); 
/* 
Array 
(
    [California] => Array 
     (
      [capital] => Sacramento 
      [joined_union] => 1850 
      [population_rank] => 1 
     ) 

    [Texas] => Array 
     (
      [capital] => Austin 
      [joined_union] => 1845 
      [population_rank] => 2 
     ) 

) 
*/ 
+1

Non sono d'accordo con "Questa non è una caratteristica molto amata di PHP" - il tipo di dati "array" di PHP è una delle funzionalità più potenti del linguaggio e può essere utilizzato al posto di tutti i tipi di tipi dedicati (elenchi, vettori, hash, code e stack, set, multiset, ecc.) – IMSoP

+0

@IMSoP Quale può o non può essere una buona cosa; i tipi dedicati possono rendere le cose migliori, così come tutte le rigorose norme di sicurezza sono generalmente buone. Sono d'accordo però che non ho quasi mai sentito nessuno lamentarsi del tipo di array di PHP. – deceze

+0

@deceze \t I tipi dedicati sono davvero utili, ma ci si basa sul fatto che ce ne sia uno disponibile che soddisfi le proprie esigenze. Javascript, ad esempio, non ha un tipo di "hash ordinato" (gli oggetti possono essere usati come hash, ma non è necessario che il runtime produca le proprietà in un ordine particolare durante il looping). Sono consapevole che è un'opinione, ma trovo il tipo di array di PHP, e il tipo di sistema in generale consente alcuni algoritmi molto utili - se usati con attenzione. – IMSoP

1

1: Gli array multidimensionali sono fondamentalmente "matrici di matrici".

Quindi, se guardiamo qui:

array("0"=>array("capital"=> "Sacramento", "joined_union"=>1850, "population_rank"=> 1) 

0 è la chiave, e la matrice è il valore.

Quindi, all'interno del valore, è necessario capital come chiave e Sacramento come valore.

2: Per gli array rimozione: Delete an element from an array

3: i nomi di Stato per le chiavi

Sì, è possibile cambiare la situazione 0, 1, 2 in nomi di stato. Diventano valori-chiave invece di un array numerato. Il che rende molto più facile rimuovere esattamente quello che vuoi rimuovere.

1

Gli array multidimensionali sono semplicemente matrici che hanno matrici come valori. Semplice o "scalare" tipi sono tipi come int, string e bool, hanno un valore e un solo valore.Gli array sono un tipo composto, il che significa che è una cosa che combina diverse altre cose insieme. Un array può contenere valori di altri tipi, inclusi gli array.

La visualizzazione più semplice è probabilmente questo longhand:

$array = array('foo' => array('bar' => 'baz')); 

$foo = $array['foo']; // $foo is now array('bar' => 'baz') 

echo $foo['bar']; // outputs 'baz' 

Questa è solo una scorciatoia per la stessa cosa come sopra:

echo $array['foo']['bar']; 

$array['foo'] dà accesso al valore array('bar' => 'baz'), ['bar'] su tale matrice ti dà il valore 'baz'. Non importa se assegni il valore intermedio in una variabile o continui direttamente.

Viceversa, ecco una dimostrazione del concetto che gli array multidimensionali sono solo gli array in matrici:

$baz = 'baz'; 
$bar = array('bar' => $baz); 
$array = array('foo' => $bar); 

Questo è tutto ciò che devi fare.

È possibile chiamare gli array nidificati in array "sotto-array", anche se non esiste una definizione reale e non è proprio necessario definirlo, poiché gli array annidati non sono un caso speciale di alcunché.

È possibile che si verifichino spiegazioni utilizzando i termini "bidimensionale", "tridimensionale" ecc. Non immaginatelo come tavoli e cubi, perché non è preciso e farà esplodere la testa quando va oltre le tre dimensioni. Questa semplice "dimensionalità" si riferisce alla profondità della matrice , vale a dire quanti matrici sono annidate l'una nell'altra.

+0

Grazie, @deceze per la spiegazione che lo rende meno complesso e intimidatorio. – Patty

Problemi correlati