1. Code
  2. PHP
  3. PHP Scripts

Richtig mit PHP-Arrays arbeiten

Scroll to top

German (Deutsch) translation by Valentina (you can also view the original English article)

In diesem Tutorial werde ich eine Liste gängiger PHP-Array-Funktionen mit Anwendungsbeispielen und Best Practices erstellen. Jeder PHP-Entwickler muss wissen, wie man sie verwendet und wie man Array-Funktionen kombiniert, um Code lesbar und kurz zu machen.

Außerdem gibt es eine Präsentation mit gegebenen Codebeispielen, sodass Sie sie von den zugehörigen Links herunterladen und Ihren Kollegen zeigen können, um ein stärkeres Team aufzubauen.

Die Grundlagen

Beginnen wir mit den Grundfunktionen, die mit Array-Schlüsseln und -Werten arbeiten. Eines davon ist array_combine(), das ein Array mit einem Array für Schlüssel und einem anderen für seine Werte erstellt:

1
$keys = ['sky', 'grass', 'orange'];
2
$values = ['blue', 'green', 'orange'];
3
4
$array = array_combine($keys, $values);
5
print_r($array);
6
7
// Array

8
// (

9
//     [sky] => blue

10
//     [grass] => green

11
//     [orange] => orange

12
// )

Sie sollten wissen, dass die Funktion array_values() ein indiziertes Array von Werten zurückgibt, array_keys() ein Array von Schlüsseln eines bestimmten Arrays zurückgibt und array_flip() Schlüssel mit Werten austauscht:

1
print_r(array_keys($array)); // ['sky', 'grass', 'orange']

2
print_r(array_values($array)); // ['blue', 'green', 'orange']

3
print_r(array_flip($array));
4
5
// Array

6
// (

7
//     [blue] => sky

8
//     [green] => grass

9
//     [orange] => orange

10
// )

Machen Sie Ihren Code kürzer

Die Funktion list(), die eigentlich keine Funktion, sondern eine Sprachkonstruktion ist, dient dazu, Variablen auf kurze Weise zuzuweisen. Hier ist beispielsweise ein grundlegendes Beispiel für die Verwendung der Funktion list():

1
// define array

2
$array = ['a', 'b', 'c'];
3
4
// without list()

5
$a = $array[0];
6
$b = $array[1];
7
$c = $array[2];
8
9
// with list()

10
list($a, $b, $c) = $array;

Diese Konstruktion funktioniert perfekt mit Funktionen wie preg_slit() oder explode(). Sie können auch einige Parameter überspringen, wenn Sie sie nicht definieren müssen:

1
$string = 'hello|wild|world';
2
list($hello, , $world) = explode('|', $string);
3
echo("$hello, $world"); // hello, world

Außerdem kann list() mit foreach verwendet werden, was diese Konstruktion noch besser macht:

1
$arrays = [[1, 2], [3, 4], [5, 6]];
2
3
foreach ($arrays as list($a, $b)) {
4
    $c = $a + $b;
5
    echo($c . ', '); // 3, 7, 11, 

6
}

Mit der Funktion extract() können Sie ein assoziatives Array in Variablen exportieren. Für jedes Element eines Arrays wird eine Variable mit dem Namen eines Schlüssels und dem Wert als Wert des Elements erstellt:

1
$array = [
2
    'clothes' => 't-shirt',
3
    'size'    => 'medium',
4
    'color'   => 'blue',
5
];
6
7
extract($array);
8
9
echo("$clothes $size $color"); // t-shirt medium blue

Beachten Sie, dass extract() nicht sicher ist, wenn Sie mit Benutzerdaten (wie Ergebnissen von Anforderungen) arbeiten. Verwenden Sie diese Funktion daher besser mit den Flags EXTR_IF_EXISTS und EXTR_PREFIX_ALL.

Das Gegenteil der vorherigen Funktion ist die compact()-Funktion, die aus Variablen ein assoziatives Array erstellt:

1
$clothes = 't-shirt';
2
$size = 'medium';
3
$color = 'blue';
4
5
$array = compact('clothes', 'size', 'color');
6
print_r($array);
7
8
// Array

9
// (

10
//     [clothes] => t-shirt

11
//     [size] => medium

12
//     [color] => blue

13
// )

Filterfunktionen

Es gibt eine großartige Funktion für die Array-Filterung, die als array_filter() bezeichnet wird. Übergeben Sie das Array als ersten Parameter und eine anonyme Funktion als zweiten Parameter. Geben Sie in einer Rückruffunktion true zurück, wenn Sie dieses Element im Array belassen möchten, und false, wenn Sie dies nicht tun:

1
$numbers = [20, -3, 50, -99, 55];
2
3
$positive = array_filter($numbers, function($number) {
4
    return $number > 0;
5
});
6
7
print_r($positive); // [0 => 20, 2 => 50, 4 => 55]

Es gibt eine Möglichkeit, nicht nur nach den Werten zu filtern. Sie können ARRAY_FILTER_USE_KEY oder ARRAY_FILTER_USE_BOTH als dritten Parameter verwenden, um den Schlüssel oder sowohl den Wert als auch den Schlüssel an die Rückruffunktion zu übergeben.

Sie können auch array_filter() ohne Rückruf aufrufen, um alle leeren Werte zu entfernen:

1
$numbers = [-1, 0, 1];
2
3
$not_empty = array_filter($numbers);
4
5
print_r($not_empty); // [0 => -1, 2 => 1]

Mit der Funktion array_unique() können Sie nur eindeutige Werte aus einem Array abrufen. Beachten Sie, dass die Funktion die Schlüssel der ersten eindeutigen Elemente beibehält:

1
$array = [1, 1, 1, 1, 2, 2, 2, 3, 4, 5, 5];
2
$uniques = array_unique($array);
3
4
print_r($uniques);
5
6
// Array

7
// (

8
//     [0] => 1

9
//     [4] => 2

10
//     [7] => 3

11
//     [8] => 4

12
//     [9] => 5

13
// )

Mit array_column() können Sie eine Liste von Spaltenwerten aus einem mehrdimensionalen Array abrufen, z. B. eine Antwort aus einer SQL-Datenbank oder einen Import aus einer CSV-Datei. Übergeben Sie einfach einen Array- und Spaltennamen:

1
$array = [
2
    ['id' => 1, 'title' => 'tree'],
3
    ['id' => 2, 'title' => 'sun'],
4
    ['id' => 3, 'title' => 'cloud'],
5
];
6
7
$ids = array_column($array, 'id');
8
9
print_r($ids); // [1, 2, 3]

Ab PHP 7 wird array_column() noch leistungsfähiger, da es jetzt mit einem Array von Objekten arbeiten darf. Die Arbeit mit einer Reihe von Modellen wurde also einfacher:

1
$cinemas = Cinema::find()->all();
2
$cinema_ids = array_column($cinemas, 'id'); // php7 forever!

Durch die Arrays gehen

Mit array_map() können Sie auf jedes Element eines Arrays einen Rückruf anwenden. Sie können einen Funktionsnamen oder eine anonyme Funktion übergeben, um ein neues Array basierend auf dem angegebenen Array zu erhalten:

1
$cities = ['Berlin', 'KYIV', 'Amsterdam', 'Riga'];
2
$aliases = array_map('strtolower', $cities);
3
4
print_r($aliases); // ['berlin', 'kyiv, 'warsaw', 'riga']

5
6
$numbers = [1, -2, 3, -4, 5];
7
$squares = array_map(function($number) {
8
    return $number ** 2;
9
}, $numbers);
10
11
print_r($squares);  // [1, 4, 9, 16, 25]

Es gibt einen Mythos, dass es keine Möglichkeit gibt, Werte und Schlüssel eines Arrays an einen Rückruf zu übergeben, aber wir können es kaputt machen:

1
$model = ['id' => 7, 'name'=>'James'];
2
3
$callback = function($key, $value) {
4
    return "$key is $value";
5
};
6
7
$res = array_map($callback, array_keys($model), $model);
8
print_r($res);
9
10
// Array

11
// (

12
//     [0] => id is 7

13
//     [1] => name is James

14
// )

Aber das sieht dreckig aus. Es ist besser, stattdessen array_walk() zu verwenden. Diese Funktion sieht genauso aus wie array_map(), funktioniert jedoch anders. Zunächst wird ein Array von einer Referenz übergeben, sodass array_walk() kein neues Array erstellt, sondern ein bestimmtes Array ändert. Als Quellarray können Sie den Arraywert also als Referenz in einem Rückruf übergeben. Array-Schlüssel können auch einfach übergeben werden:

1
$fruits = [
2
    'banana' => 'yellow',
3
    'apple' => 'green',
4
    'orange' => 'orange',
5
];
6
7
array_walk($fruits, function(&$value, $key) {
8
    $value = "$key is $value";
9
});
10
11
print_r($fruits);
12
13
// Array

14
// (

15
//     [banana] => banana is yellow

16
//     [apple] => apple is green

17
//     [orange] => orange is orange

18
// )

Beitritt zu den Arrays

Der beste Weg, um zwei oder mehr Arrays in PHP zusammenzuführen, ist die Verwendung der Funktion array_merge(). Elemente von Arrays werden zusammengeführt und Werte mit denselben Zeichenfolgenschlüsseln werden mit dem letzten Wert überschrieben:

1
$array1 = ['a' => 'a', 'b' => 'b', 'c' => 'c'];
2
$array2 = ['a' => 'A', 'b' => 'B', 'D' => 'D'];
3
4
$merge = array_merge($array1, $array2);
5
print_r($merge);
6
// Array

7
// (

8
//     [a] => A

9
//     [b] => B

10
//     [c] => c

11
//     [D] => D

12
// )

Verwenden Sie array_diff(), um Array-Werte aus einem anderen Array (oder Arrays) zu entfernen. Verwenden Sie array_intersect(), um Werte abzurufen, die in bestimmten Arrays vorhanden sind. Die nächsten Beispiele zeigen, wie es funktioniert:

1
$array1 = [1, 2, 3, 4];
2
$array2 =       [3, 4, 5, 6];
3
4
$diff = array_diff($array1, $array2);
5
print_r($diff); // [0 => 1, 1 => 2]

6
7
$intersect = array_intersect($array1, $array2);
8
print_r($intersect);  // [2 => 3, 3 => 4]

Rechnen Sie mit Array-Werten

Verwenden Sie array_sum(), um eine Summe der Array-Werte zu erhalten, array_product(), um sie zu multiplizieren, oder erstellen Sie Ihre eigene Formel mit array_reduce():

1
$numbers = [1, 2, 3, 4, 5];
2
3
echo(array_sum($numbers)); // 15

4
echo(array_product($numbers)); // 120

5
6
echo(array_reduce($numbers, function($carry, $item) {
7
    return $carry ? $carry / $item : 1;
8
})); // 0.0083 = 1/2/3/4/5

Verwenden Sie array_count_values(), um alle Werte eines Arrays zu zählen. Es werden alle eindeutigen Werte eines bestimmten Arrays als Schlüssel und eine Anzahl dieser Werte als Wert angegeben:

1
$things = ['apple', 'apple', 'banana', 'tree', 'tree', 'tree'];
2
$values = array_count_values($things);
3
4
print_r($values);
5
6
// Array

7
// (

8
//     [apple] => 2

9
//     [banana] => 1

10
//     [tree] => 3

11
// )

Arrays generieren

Verwenden Sie array_fill(), um ein Array mit einer bestimmten Größe und demselben Wert zu generieren:

1
$bind = array_fill(0, 5, '?');
2
print_r($bind); // ['?', '?', '?', '?', '?']

Verwenden Sie range(), um ein Array mit einem Bereich von Schlüsseln und Werten wie Tagesstunden oder Buchstaben zu generieren:

1
$letters = range('a', 'z');
2
print_r($letters); // ['a', 'b', ..., 'z']

3
4
$hours = range(0, 23);
5
print_r($hours); // [0, 1, 2, ..., 23]

Verwenden Sie array_slice(), um einen Teil eines Arrays abzurufen, z. B. nur die ersten drei Elemente:

1
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
2
$top = array_slice($numbers, 0, 3);
3
print_r($top); // [1, 2, 3]

Arrays sortieren

Es ist gut daran zu denken, dass jede Sortierfunktion in PHP mit Arrays anhand einer Referenz arbeitet und bei Erfolg true oder bei Fehler false zurückgibt. Es gibt eine grundlegende Sortierfunktion namens sort(), die Werte in aufsteigender Reihenfolge sortiert, ohne dass die Schlüssel erhalten bleiben. Der Sortierfunktion können folgende Buchstaben vorangestellt werden:

  • a, sortieren Sie die Schlüssel
  • k, nach Schlüsseln sortieren
  • r, sortiere in umgekehrter/absteigender Reihenfolge
  • u, sortiere mit einer Benutzerfunktion

Sie können die Kombinationen dieser Buchstaben in der folgenden Tabelle sehen:

ein k r u
ein asort arsort uasort
k ksort krsort
r arsort krsort rsort
u uasort usort

Array-Funktionen wie ein Boss kombinieren

Die wahre Magie beginnt, wenn Sie beginnen, Array-Funktionen zu kombinieren. So können Sie mit array_filter() und array_map() leere Werte in nur einer Codezeile zuschneiden und entfernen:

1
$values = ['say  ', '  bye', ' ', ' to', ' spaces ', '   '];
2
3
$words = array_filter(array_map('trim', $values));
4
print_r($words); // ['say', 'bye', 'to', 'spaces']

Um eine ID für eine Titelzuordnung aus einem Array von Modellen zu erstellen, können Sie eine Kombination aus array_combine() und array_column() verwenden:

1
$models = [$model1, $model2, $model3];
2
3
$id_to_title = array_combine(
4
    array_column($models, 'id'),
5
    array_column($models, 'title')
6
);

Um die drei besten Werte eines Arrays zu erhalten, können Sie array_count_values(), arsort() und array_slice() verwenden:

1
$letters = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'd', 'd', 'd'];
2
3
$values = array_count_values($letters); // get key to count array

4
arsort($values); // sort descending preserving key

5
$top = array_slice($values, 0, 3); // get top 3

6
7
print_r($top);
8
// Array

9
// (

10
//     [d] => 5

11
//     [a] => 4

12
//     [b] => 2

13
// )

Es ist einfach, array_sum() und array_map() zu verwenden, um die Ordnungssumme in wenigen Zeilen zu berechnen:

1
$order = [
2
    ['product_id' => 1, 'price' => 99, 'count' => 1],
3
    ['product_id' => 2, 'price' => 50, 'count' => 2],
4
    ['product_id' => 2, 'price' => 17, 'count' => 3],
5
];
6
7
$sum = array_sum(array_map(function($product_row) {
8
    return $product_row['price'] * $product_row['count'];
9
}, $order));
10
11
print_r($sum); // 250

Abschluss

Wie Sie sehen können, kann die Kenntnis der Hauptfunktionen des Arrays Ihren Code viel kürzer und lesbarer machen. Natürlich hat PHP viel mehr Array-Funktionen, und selbst die angegebenen Funktionen haben viele Variationen, die mit zusätzlichen Parametern und Flags verwendet werden können, aber ich denke, dass wir in diesem Tutorial die Grundlagen behandelt haben, die jeder PHP-Entwickler kennen sollte.

Bitte beachten Sie, dass ich eine Präsentation mit den angegebenen Beispielen erstellt habe, damit Sie sie von den zugehörigen Links herunterladen und Ihrem Team zeigen können.

Wenn Sie Fragen haben, zögern Sie nicht, diese in den Kommentaren zum Artikel zu stellen.

Weiterführende Literatur und verwandte Links