search
subnavi
Werbung

Arrays und Arrayvariablen

Frage: Wie kann ich ein Element an ein Array anfügen?

Antwort von Kristian Köhntopp:

Durch Verwendung des leeren Arrayoperators wird an ein Array ein Element angehängt. In Code:

$avar[] = "neues element"; 

In PHP 4 kann man mit der Funktion array_push() auch mehrere Elemente gleichzeitig an ein Array anfügen.

Durch Verwendung eines Index kann man ein Element an einer bestimmten Stelle in einem Array ansprechen. Der Index kann numerisch oder ein String sein:

$avar[1]     = "Element mit dem Index 1";
$avar["bla"] = "Element mit dem Index 'bla'"; 

Frage: Wie kann ich ein Array aufzählen?

Antwort von Kristian Köhntopp:

Ein Array enthält $anz = count($avar) viele Elemente. Man kann diese Elemente mit einer for -Schleife aufzählen, falls die Indizes numerisch-zusammenhängend sind:

$avar = array('rot', 'gelb', 'blau', 'schwarz');
$anz = count($avar);
for ($i=0; $i<$anz; $i++) {
    printf("i: %d avar[%d] = %s<br>\n", $i, $i, $avar[$i]);
} 

Für assoziative Arrays ist dieses Konstrukt besser geeignet:

if (isset($avar) && is_array($avar)) {
    foreach ($avar as $k => $v) {
        printf("k=%s v=%s<br>\n", $k, $v);
    }
} 

In PHP3 hat man oft die folgende Syntax verwendet, die inzwischen veraltet (aber noch funktionsfähig) ist:

if (isset($avar) && is_array($avar)) {
    reset($avar);
    while (list($k, $v) = each($avar)) {
        printf("k=%s v=%s<br>\n", $k, $v);
    }
} 

Es macht Gebrauch von den Funktionen reset() um den internen Positionszeiger eines Arrays zurückzusetzen, list() um einen Zuweisungskontext für ein Wertepaar $k und $v zu erzeugen und each() um den Schlüssel ( key , k ) und den Wert ( value , v ) an der aktuellen Position des Arrays auszulesen.

Von der Anwendung der veralteten und defekten Funktionen next() , prev() und current() ist in diesem Zusammenhang abzuraten, da sie bei Arrays mit Nullwerten falsche Ergebnisse liefern. Diese Schleife wird nur die Werte -2 und -1 ausgeben, da hier der Wert 0 nicht vom Feldende unterschieden werden kann:

$avar = array(-2, -1, 0, 1, 2);
for (reset($avar); $v = current($avar); next($avar)) {
    printf("v = %d<br>\n", $v);
} 

Frage: Wie kann ich ein Element aus einem Array löschen?

Antwort von Johannes Frömter:

Mit unset() kann man sowohl Variablen (Strings, ganze Arrays etc.) als auch einzelne Elemente eines Arrays löschen:

$array = array('P', 'H', 'P');

// Löscht das 'H'
unset($array[1]);

// Löscht das ganze Array
unset($array); 

Durch das Löschen einzelner Einträge entstehen Lücken im Index des Arrays (d.h. $array[1] greift ins Leere); die Array-Funktionen selbst (wie z.B. foreach() oder each() ) stört dies jedoch nicht. Benötigt man dennoch ein Array mit fortlaufendem Index für direkten Zugriff, muss man es aus den verbleibenden Elementen neu erstellen:

// Array mit fortlaufendem Index erzeugen
$array = array_values($array); 

Weiterhin kann man auch mit array_splice() Teile eines Arrays entfernen, und dabei automatisch einen zusammenhängenden numerischen Index erzeugen lassen (falls das benötigt wird):

// In $array ab Index 1 ein Element durch nichts ersetzen
array_splice($array, 1, 1); 

Frage: Wie greife ich auf ein mehrdimensionales Array zu?

Antwort von Kristian Köhntopp:

Das lässt sich am einfachsten an einem kleinen Beispiel zeigen:

$array = array(
   "foo" => array ("a", "b"),
   "bar" => array ("c", "d")
   );

print($array["foo"][0]); // gibt "a" aus.
print($array["bar"][1]); // gibt "d" aus. 

Frage: Wie kann ich ein Array nach einem beliebigen Kriterium sortieren lassen?

Antwort von Kristian Köhntopp:

PHP stellt eine Reihe von vordefinierten Sortierfunktionen zur Verfügung. Wenn diese nicht ausreichen, kann man mit Hilfe der Funktion usort() nach beliebigen Kriterien sortieren lassen. Der Funktion muss eine Vergleichsfunktion und das zu sortierende Array als Parameter mit übergeben werden.

Das nachfolgende Beispiel sortiert ein Array von Paaren alphabetisch nach dem 2. Element.

kris@valiant:~ > ./php
<?php
  $a = array(
         array(0, "Schmidt"),
         array(2, "Albert")
       );

  function cmp($a, $b) {
    printf("type a = %s type b = %s\n", gettype($a), gettype($b));
    if ($a[1] == $b[1]) return 0;
    return ($a[1] > $b[1])?1:-1;
  }

  usort ($a, "cmp");

  foreach($a as $k => $v)
      printf("k = %s  v[0] = %s  v[1] = %s\n", $k, $v[0], $v[1]);
?>
X-Powered-By: PHP/4.0b5-dev
Content-type: text/html; charset=iso-8859-1

type a = array type b = array
k = 0  v[0] = 2  v[1] = Albert
k = 1  v[0] = 0  v[1] = Schmidt
kris@valiant:~ > 
Antwort von Johannes Frömter:

Weiterhin gibt es die Funktion array_multisort() , die - gefüttert mit einem passenden (eindimensionalen) "Sortierarray" - mehrdimensionale Arrays nach beliebigen Dimensionen ordnen kann.

foreach($a as $v) $s[] = $v[1];    // [1] = Dimension zur Sortierung
array_multisort($s, SORT_ASC, $a); // ASC = auf-, DESC = absteigend 

Durch Einfügen weiterer "Sortierarrays" ( $s ) vor dem "Nutzarray" $a kann man auch nach mehreren Kriterien gleichzeitig sortieren lassen. Dabei kann nach jedem "Sortierarray" die Sortierrichtung und -art neu bestimmt werden.

Frage: Wie kann ich Duplikate aus einem Array entfernen?

Antwort von Johannes Frömter:

Seit PHP Version 4.0.1 gibt es die Funktion array_unique() , um doppelte Einträge in Arrays zu eliminieren.

Anmerkung: array_unique() behält die Indizes des Original- Arrays bei. Um auf die Elemente des Arrays mit fortlaufenden numerischen Indizes von 0 bis count()-1 zugreifen zu können, verwende man

$a = array_values(array_unique($a)); 

In PHP3 kann man sich z.B. mit folgender Konstruktion behelfen: arrays-duplikate-php3

Frage: Wie kann ich ein Array von einer Seite auf eine andere transportieren?

Antwort von Martin Jansen:

Die einzig vernünftige und sichere Methode, um ein Array von einer Seite auf eine andere Seite zu transportieren, ist das Ablegen des Arrays in einer Session auf dem Server. Alle anderen Methoden stellen ein Sicherheitsrisiko dar und sollten nicht angewendet werden.

Weitere Informationen zu Sessions finden sich in version4_session und in sessions-zweck

Im Prinzip kann man ein Array mit serialize() in einen String verwandeln und per URL weiterreichen (URL-Codierung etc. nicht vergessen), aber das ist wegen der begrenzten Länge von URLs und der Manipulationsmöglichkeit durch den Benutzer zu vermeiden.