Arrayer

I denna lektionen går vi igenom hur datatypen array fungerar och vilken användning man har av den. En array fungerar i princip som en vanlig variabel, men den kan spara flera olika värden samtidigt.

Lägga till och komma åt värden

En array är en datatyp som kan lagra flera olika värden samtidigt, jämfört med en vanlig variabel som bara kan lagra ett värde. Varje värde i en array har dessutom sin egna, unika nyckel, så man kan referera till ett visst värde i en array med hjälp av dess nyckel (som även går under namnet index).

Man kan lägga till värden i en array på två olika sätt: antingen då den skapas eller efteråt, när den har skapats. Värdena kan vara av vilken datatyp som helst. För att lägga till värden när den skapas skriver man såhär:

PHP - PHP: Hypertext Preprocessor
<?php // Skapa en array med 3 värden $minArray = array("Värde1", "Värde2", "Värde3"); // Värdena separeras med kommatecknet /* För att få koden mer lättläst kan man skriva den på flera rader och indentera den, som nedan */ $minArray = array( "Värde1", "Värde2", "Värde3" ); ?>

Om man vill lägga till ett nytt värde i en array efter den skapats gör man såhär:

PHP - PHP: Hypertext Preprocessor
<?php // Skapa en array och lägg till ett värde $minArray = array("Värde1"); // Om man vill ha en tom array skriver man: $minArray = array(); /* Det är bara att lägga till [] på slutet av arrayens namn och ge den ett värde som med en vanlig variabel */ $minArray[] = "Värde2"; $minArray[] = "Värde3"; ?>

Första värdet i en array får automatiskt nyckeln 0, andra värdet i en array automatiskt får nyckeln 1, tredje värdet i en array får automatiskt nyckeln 2, och så vidare. Om man vill komma åt ett visst värde skriver man: $arrayensNamn[NYCKELN].

PHP - PHP: Hypertext Preprocessor
<?php $operativsystem = array( "Windows", // Får automatiskt nyckeln 0 "Mac", // Får automatiskt nyckeln 1 "Linux" // Får automatiskt nyckeln 2 ); echo "<p>Nyckeln 0 har värdet <b>".$operativsystem[0]."</b>.</p>\n"; echo "<p>Nyckeln 1 har värdet <b>".$operativsystem[1]."</b>.</p>\n"; echo "<p>Nyckeln 2 har värdet <b>".$operativsystem[2]."</b>.</p>"; ?>
HTML - output
<p>Nyckeln 0 har värdet <b>Windows</b>.</p> <p>Nyckeln 1 har värdet <b>Mac</b>.</p> <p>Nyckeln 2 har värdet <b>Linux</b>.</p>

Nyckeln 0 har värdet Windows.

Nyckeln 1 har värdet Mac.

Nyckeln 2 har värdet Linux.

Man kan även använda egna nycklar, och dem anger man i samma veva som man lägger till värdena i arrayen.

PHP - PHP: Hypertext Preprocessor
<?php // Ange nycklar då arrayen skapas /* Koden kan skrivas på en rad, men den blir enklare att läsa om den står på flera */ $minArray = array( "Nyckel1" => "Värde1", "Nyckel2" => "Värde2", "Nyckel3" => "Värde3" ); // Ange nycklar då man lägger till värden $minArray["Nyckel4"] = "Värde4"; echo "<p>Nyckeln <b>Nyckel3</b> har värdet <b>".$minArray["Nyckel3"]."</b>.</p>"; ?>
HTML - output
<p>Nyckeln <b>Nyckel3</b> har värdet <b>Värde3</b>.</p>

Nyckeln Nyckel3 har värdet Värde3.

Nycklar man själv anger måste inte vara en strängar, de kan även vara tal.

Loopa igenom alla element

Nu undrar du antagligen vad man har för nytta av en array, för till det du sett hittills kan man lika gärna använda vanliga variabler. Men med vanliga variabler kan man inte skriva en loop som körs för alla variabler, vilket man däremot kan göra för alla värden i en array med hjälp av loopen foreach. Nedan följer ett exempel på hur man använder den.

PHP - PHP: Hypertext Preprocessor
<?php // En array med mina kompisar $minaKompisar = array( "Pelle", "Lisa", "Per", "Angela" ); // Skriv ut en text innan loopen echo "<p>Innan loopen!</p>\n"; foreach($minaKompisar as $kompis){ /* Koden mellan { på slutet av rad 14 och } i början på rad 27 kommer att köras för alla värden i arrayen $minaKompisar. För varje gång loopen körs kommer $kompis referera till ett av värdena i arrayen, alla i tur och ordning. */ // Skriv ut denna kompisen echo "<p>".$kompis."</p>\n"; } // Skriv ut en text efter loopen echo "<p>Efter loopen!</p>"; ?>
HTML - output
<p>Innan loopen!</p> <p>Pelle</p> <p>Lisa</p> <p>Per</p> <p>Angela</p> <p>Efter loopen!</p>

Innan loopen!

Pelle

Lisa

Per

Angela

Efter loopen!

På rad 14 visar vi att värdena i arrayen ska ligga i variabeln $kompis. Denna variabel kan du döpa till något annat om du vill (du kanske tycker att $namn är mer passande?).

Nedan skriver vi ut alla kompisarna i en lista istället, och använder oss av $namn istället för $kompis för att referara till nuvarande värde i arrayen i loopen.

PHP - PHP: Hypertext Preprocessor
<?php // En array med mina kompisar $minaKompisar = array( "Pelle", "Lisa", "Per", "Angela" ); // Vi kommer visa alla kompisar i en lista, så skriv ut <ul>-taggen echo "<ul>\n"; foreach($minaKompisar as $namn){ // Skriv ut denna kompisen i en <li>-tagg (\t och \n är till för att få lättläst output). echo "\t<li>".$namn."</li>\n"; } // Sluttaggen på <ul> echo "</ul>"; ?>
HTML - output
<ul> <li>Pelle</li> <li>Lisa</li> <li>Per</li> <li>Angela</li> </ul>
  • Pelle
  • Lisa
  • Per
  • Angela

Koden ovanför är ett exempel på uppdelning av data och presentation, vilket man bör sträva efter. På raderna 4-9 har vi samlat all data (namnen på alla kompisar), och koden nedanför genererar HTML-kod som presenterar den. Det fina med denna uppdelningen är att det blir enkelt att ändra i koden vid senare tillfällen. Om vi vill lägga till mer data (fler namn på kompisar) behöver vi bara lägga till det i arrayen på raderna 4-9, utan att ändra i koden nedanför som genererar HTML-koden. Om vi istället vill visa den data vi har (namnen på kompisarna) på ett annat sätt behöver vi bara ändra i koden som genererar HTML-koden, utan att ändra i koden där all data finns sparad.

Om man vill kan man även få reda på nyckeln det nuvarande värdet i loopen har. Nedan följer ett exempel på hur koden ser ut då.

PHP - PHP: Hypertext Preprocessor
<?php $minaKompisar = array( "Pelle", "Lisa", "Per", "Angela" ); echo "<ul>\n"; foreach($minaKompisar as $nyckel => $kompis){ echo "\t<li>".$kompis." har nyckeln <b>".$nyckel."</b>.</li>\n"; } echo "</ul>"; ?>
HTML - output
<ul> <li>Pelle har nyckeln <b>0</b>.</li> <li>Lisa har nyckeln <b>1</b>.</li> <li>Per har nyckeln <b>2</b>.</li> <li>Angela har nyckeln <b>3</b>.</li> </ul>
  • Pelle har nyckeln 0.
  • Lisa har nyckeln 1.
  • Per har nyckeln 2.
  • Angela har nyckeln 3.

I exemplet ovan anger vi att vi ska komma åt nyckeln med hjälp av variabeln $nyckel. Denna variabeln måste inte heta $nyckel, utan du kan döpa den till vad du vill.

Med hjälp av loopen foreach kan man även räkna antalet element i en array. Nedan följer ett exempel på hur.

PHP - PHP: Hypertext Preprocessor
<?php $minaKompisar = array( "Pelle", "Lisa", "Per", "Angela" ); // En variabel som ökar med 1 för varje varv loopen gör $antal = 0; foreach($minaKompisar as $kompis){ $antal++; } echo "<p>Jag har $antal kompisar.</p>"; ?>
HTML - output
<p>Jag har 4 kompisar.</p>

Jag har 4 kompisar.

Associativ array

En annan bra sak med arrayer är att man kan göra en så kallad associativ array. En associativ array är en array där nyckeln beskriver värdet.

PHP - PHP: Hypertext Preprocessor
<?php $information = array( "Namn" => "Peppe L-G", "Vikt" => "80kg", "Land" => "Sverige" ); foreach($information as $nyckel => $varde){ echo "<b>".$nyckel."</b>: ".$varde."<br>\n"; } ?>
HTML - output
<b>Namn</b>: Peppe L-G<br> <b>Vikt</b>: 80kg<br> <b>Land</b>: Sverige<br>
Namn: Peppe L-G
Vikt: 80kg
Land: Sverige

På detta sättet kan man enkelt lägga till mer informationen om personen eller enkelt ändra hur informationen ska skrivas ut, jämfört med ifall vi enbart skulle ha tillgång till HTML-koden ovan (ännu ett exempel på uppdelning av data och presentation).

Flerdimensionella arrayer

En lite mer avancerad sak, men väldigt bra att kunna, är flerdimensionella arrayer. En flerdimensionell array är en array som har andra arrayer som värden. Nedan följer ett exempel på en flerdimensionell array som innehåller information om vad siffrorna 1, 2 och 3 heter på svenska, engelska och spanska.

PHP - PHP: Hypertext Preprocessor
<?php // En array med siffrors namn på olika språk $siffernamn = array( 1 => array( "svenska" => "Ett", "engelska" => "One", "spanska" => "Uno" ), 2 => array( "svenska" => "Två", "engelska" => "Two", "spanska" => "Dos" ), 3 => array( "svenska" => "Tre", "engelska" => "Three", "spanska" => "Tres" ) ); // Skriv ut vad siffran 2 heter på spanska echo $siffernamn[2]["spanska"]; ?>
HTML - HyperText Markup Language
Dos
Dos

På rad 23 kommer vi åt vad siffran 2 heter på spanska genom att skriva $siffernamn[2]["spanska"]. Inom den första hakparentesen skriver vi nyckeln i arrayens första dimension, i det här fallet 2. Då får vi tillbaka hela arrayen med nyckeln 2, det vill säga en array med de element som står på rad 10-14 och som ser ut såhär:

PHP - PHP: Hypertext Preprocessor
<?php // Arrayen vi får tillbaks genom att skriva $siffernamn[2] är följande: array( "svenska" => "Två", "engelska" => "Two", "spanska" => "Dos" ) ?>

Direkt efter den första hakparentesen skriver vi sedan en ny hakparentes med nyckeln "spanska". Det betyder att vi vill åt värdet som har nyckeln "spanska" från den array vi fick tillbaka från den första nyckeln, vilket blir "Dos", och som är det spanska ordet för 2.

Vill vi veta namnet på en annan siffra behöver vi bara byta ut 2 mot den nya siffran, och om vi vill veta dess namn på ett annat språk behöver vi bara byta ut "spanska" mot det nya språket ("svenska" eller "engelska").

Om man vill loopa igenom alla värden i en flerdimensionell array behöver man ha flera foreach-loopar i varandra, vilket kan vara lite krångligt att få ordning på. Nedan följer ett exempel på en array vars nycklar är namn på olika kontinenter och vars värden är en array som innehåller några nationer (länder) som finns i den kontinenten.

PHP - PHP: Hypertext Preprocessor
<?php $kontinenter = array( "Asien" => array( "Ryssland", "Kina", "Japan" ), "Europa" => array( "Sverige", "Norge", "Italien", "Spanien" ), "Nordamerika" => array( "USA", "Kanada" ), "Afrika" => array( "Madagaskar", "Elfenbenskusten", "Kenya", "Kongo", "Liberia" ) ); foreach($kontinenter as $kontinent => $nationer){ // Nyckeln $kontinent är namnet på kontinenten // Värdet $nationer är en array med namn på nationer echo "<h1>".$kontinent."</h1>\n"; echo "<ul>\n"; foreach($nationer as $nation){ echo "\t<li>".$nation."</li>\n"; } echo "</ul>\n\n"; } ?>
HTML - output
<h1>Asien</h1> <ul> <li>Ryssland</li> <li>Kina</li> <li>Japan</li> </ul> <h1>Europa</h1> <ul> <li>Sverige</li> <li>Norge</li> <li>Italien</li> <li>Spanien</li> </ul> <h1>Nordamerika</h1> <ul> <li>USA</li> <li>Kanada</li> </ul> <h1>Afrika</h1> <ul> <li>Madagaskar</li> <li>Elfenbenskusten</li> <li>Kenya</li> <li>Kongo</li> <li>Liberia</li> </ul>

Asien

  • Ryssland
  • Kina
  • Japan

Europa

  • Sverige
  • Norge
  • Italien
  • Spanien

Nordamerika

  • USA
  • Kanada

Afrika

  • Madagaskar
  • Elfenbenskusten
  • Kenya
  • Kongo
  • Liberia

Det här kan verkligen vara förvirrande i början, så oroa dig inte ifall du har svårt att förstå vad som händer. Kom tillbaka till denna lektionen vid ett senare tillfälle när du har lite mer vana av PHP, så tycker du nog att koden faktiskt ser lite vettig ut.

Gå till nästa lektion, Grundläggande formulärhantering.