Array-Funktionen
Diese Seite befasst sich mit den Klassen Nette\Utils\Arrays, ArrayHash und ArrayList, die mit Arrays zu tun haben.
Installation:
composer require nette/utils
Arrays
Nette\Utils\Arrays ist eine statische Klasse, die eine Handvoll praktischer Array-Funktionen enthält. Ihre Entsprechung für Iteratoren ist Nette\Utils\Iterables.
Die folgenden Beispiele setzen voraus, dass der folgende Klassenalias definiert ist:
use Nette\Utils\Arrays;
associate(array $array, mixed $path): array|\stdClass
Die Funktion wandelt die $array
flexibel in ein assoziatives Array oder Objekte entsprechend dem angegebenen Pfad
$path
um. Der Pfad kann eine Zeichenkette oder ein Array sein. Er besteht aus den Namen der Schlüssel im
Eingabe-Array und Operatoren wie ‚[]‘, ‚->‘, ‚=‘ und ‚|‘. Wirft Nette\InvalidArgumentException
,
wenn der Pfad ungültig ist.
// Umwandlung in ein assoziatives Array unter Verwendung eines einfachen Schlüssels
$arr = [
['name' => 'John', 'age' => 11],
['name' => 'Mary', 'age' => null],
//...
];
$result = Arrays::associate($arr, 'name');
// $result = ['John' => ['name' => 'John', 'age' => 11], 'Mary' => ['name' => 'Mary', 'age' => null]]
// Zuweisung von Werten von einem Schlüssel zu einem anderen mit dem Operator =
$result = Arrays::associate($arr, 'name=age'); // oder ['name', '=', 'age']
// $result = ['John' => 11, 'Mary' => null, ...]
// Erstellen eines Objekts mit dem ->-Operator
$result = Arrays::associate($arr, '->name'); // oder ['->', 'name']
// $result = (object) ['John' => ['name' => 'John', 'age' => 11], 'Mary' => ['name' => 'Mary', 'age' => null]]
// Schlüssel mit dem Operator | kombinieren
$result = Arrays::associate($arr, 'name|age'); // oder ['name', '|', 'age']
// $result: ['John' => ['name' => 'John', 'age' => 11], 'Paul' => ['name' => 'Paul', 'age' => 44]]
// Hinzufügen zu einem Array mit []
$result = Arrays::associate($arr, 'name[]'); // oder ['name', '[]']
// $result: ['John' => [['name' => 'John', 'age' => 22], ['name' => 'John', 'age' => 11]]]
contains(array $array, $value): bool
Prüft ein Array auf das Vorhandensein eines Wertes. Verwendet einen strengen Vergleich (===
)
Arrays::contains([1, 2, 3], 1); // true
Arrays::contains(['1', false], 1); // false
every(array $array, callable $predicate): bool
Prüft, ob alle Elemente im Array den Test bestehen, der von der angegebenen Funktion mit der Signatur
function ($value, $key, array $array): bool
implementiert wird.
$array = [1, 30, 39, 29, 10, 13];
$isBelowThreshold = fn($value) => $value < 40;
$res = Arrays::every($array, $isBelowThreshold); // true
Siehe some().
filter(array $array, callable $predicate): array
Gibt ein neues Array zurück, das alle Schlüssel-Wert-Paare enthält, die mit dem angegebenen $predicate
übereinstimmen. Der Callback hat die Signatur function ($value, int|string $key, array $array): bool
.
Arrays::filter(
['a' => 1, 'b' => 2, 'c' => 3],
fn($v) => $v < 3,
);
// ['a' => 1, 'b' => 2]
first(array $array, ?callable $predicate=null, ?callable $else=null): mixed
Gibt das erste Element zurück (das dem angegebenen Prädikat entspricht, falls angegeben). Wenn es kein solches Element gibt,
wird das Ergebnis des Aufrufs von $else
oder null zurückgegeben.
$predicate
hat die Signatur function ($value, int|string $key, array $array): bool
.
Im Gegensatz zu reset()
wird der interne Zeiger nicht verändert. Die Parameter $predicate
und
$else
gibt es seit Version 4.0.4.
Arrays::first([1, 2, 3]); // 1
Arrays::first([1, 2, 3], fn($v) => $v > 2); // 3
Arrays::first([]); // null
Arrays::first([], else: fn() => false); // false
Siehe last().
firstKey(array $array, ?callable $predicate=null): int|string|null
Gibt den Schlüssel des ersten Elements zurück (das mit dem angegebenen Prädikat übereinstimmt, falls gegeben) oder null,
wenn es kein solches Element gibt. $predicate
hat die Signatur
function ($value, int|string $key, array $array): bool
.
Arrays::firstKey([1, 2, 3]); // 0
Arrays::firstKey([1, 2, 3], fn($v) => $v > 2); // 2
Arrays::firstKey(['a' => 1, 'b' => 2]); // 'a'
Arrays::firstKey([]); // null
Siehe lastKey().
flatten(array $array, bool $preserveKeys=false): array
Wandelt ein mehrdimensionales Array in ein flaches Array um.
$array = Arrays::flatten([1, 2, [3, 4, [5, 6]]]);
// $array = [1, 2, 3, 4, 5, 6];
get(array $array, string|int|array $key, ?mixed $default=null): mixed
Gibt $array[$key]
Element. Wenn es nicht existiert, wird Nette\InvalidArgumentException
ausgelöst,
es sei denn, ein Standardwert wird als drittes Argument angegeben.
// wenn $array['foo'] nicht existiert, wird eine Ausnahme ausgelöst
$value = Arrays::get($array, 'foo');
// wenn $array['foo'] nicht existiert, gibt 'bar' zurück
$value = Arrays::get($array, 'foo', 'bar');
Das Argument $key
kann ebenso gut ein Array sein.
$array = ['color' => ['favorite' => 'red'], 5];
$value = Arrays::get($array, ['color', 'favorite']);
// returns 'red'
getRef(array &$array, string|int|array $key): mixed
Ruft eine Referenz auf die angegebene $array[$key]
. Wenn der Index nicht existiert, wird ein neuer Index mit dem
Wert null
erstellt.
$valueRef = & Arrays::getRef($array, 'foo');
// returns $array['foo'] reference
Funktioniert sowohl mit mehrdimensionalen Arrays als auch mit get().
$value = & Arrays::get($array, ['color', 'favorite']);
// returns $array['color']['favorite'] reference
grep(array $array, string $pattern, bool $invert=false): array
Gibt nur die Array-Elemente zurück, die einem regulären Ausdruck $pattern
entsprechen. Wenn $invert
gleich true
ist, werden Elemente zurückgegeben, die nicht übereinstimmen. Ein Regex-Kompilierungs- oder
Laufzeitfehler führt zu Nette\RegexpException
.
$filteredArray = Arrays::grep($array, '~^\d+$~');
// gibt nur numerische Elemente zurück
insertAfter(array &$array, string|int|null $key, array $inserted): void
Fügt den Inhalt des Arrays $inserted
in $array
unmittelbar nach $key
ein. Wenn
$key
null
ist (oder nicht existiert), wird es am Ende eingefügt.
$array = ['first' => 10, 'second' => 20];
Arrays::insertAfter($array, 'first', ['hello' => 'world']);
// $array = ['first' => 10, 'hello' => 'world', 'second' => 20];
insertBefore(array &$array, string|int|null $key, array $inserted): void
Fügt den Inhalt des Arrays $inserted
in $array
vor $key
ein. Wenn $key
gleich null
ist (oder nicht existiert), wird er am Anfang eingefügt.
$array = ['first' => 10, 'second' => 20];
Arrays::insertBefore($array, 'first', ['hello' => 'world']);
// $array = ['hello' => 'world', 'first' => 10, 'second' => 20];
invoke(iterable $callbacks, …$args): array
Ruft alle Callbacks auf und gibt ein Array mit den Ergebnissen zurück.
$callbacks = [
'+' => fn($a, $b) => $a + $b,
'*' => fn($a, $b) => $a * $b,
];
$array = Arrays::invoke($callbacks, 5, 11);
// $array = ['+' => 16, '*' => 55];
invokeMethod(iterable $objects, string $method, …$args): array
Ruft die Methode für jedes Objekt in einem Array auf und gibt ein Array mit Ergebnissen zurück.
$objects = ['a' => $obj1, 'b' => $obj2];
$array = Arrays::invokeMethod($objects, 'foo', 1, 2);
// $array = ['a' => $obj1->foo(1, 2), 'b' => $obj2->foo(1, 2)];
isList(array $array): bool
Prüft, ob das Array in aufsteigender Reihenfolge der numerischen Schlüssel von Null an indiziert ist, d.h. eine Liste.
Arrays::isList(['a', 'b', 'c']); // true
Arrays::isList([4 => 1, 2, 3]); // false
Arrays::isList(['a' => 1, 'b' => 2]); // false
last(array $array, ?callable $predicate=null, ?callable $else=null): mixed
Gibt das letzte Element zurück (das dem angegebenen Prädikat entspricht, falls angegeben). Wenn es kein solches Element gibt,
wird das Ergebnis des Aufrufs von $else
oder null zurückgegeben.
$predicate
hat die Signatur function ($value, int|string $key, array $array): bool
.
Im Gegensatz zu end()
wird der interne Zeiger nicht verändert. Die Parameter $predicate
und
$else
gibt es seit Version 4.0.4.
Arrays::last([1, 2, 3]); // 3
Arrays::last([1, 2, 3], fn($v) => $v < 3); // 2
Arrays::last([]); // null
Arrays::last([], else: fn() => false); // false
Siehe first().
lastKey(array $array, ?callable $predicate=null): int|string|null
Gibt den Schlüssel des letzten Elements zurück (das mit dem angegebenen Prädikat übereinstimmt, falls angegeben) oder null,
wenn es kein solches Element gibt. $predicate
hat die Signatur
function ($value, int|string $key, array $array): bool
.
Arrays::lastKey([1, 2, 3]); // 2
Arrays::lastKey([1, 2, 3], fn($v) => $v < 3); // 1
Arrays::lastKey(['a' => 1, 'b' => 2]); // 'b'
Arrays::lastKey([]); // null
Siehe firstKey().
map(array $array, callable $transformer): array
Ruft $transformer
für alle Elemente im Array auf und gibt das Array der Rückgabewerte zurück. Der Callback hat
die Signatur function ($value, $key, array $array): bool
.
$array = ['foo', 'bar', 'baz'];
$res = Arrays::map($array, fn($value) => $value . $value);
// $res = ['foofoo', 'barbar', 'bazbaz']
mapWithKeys(array $array, callable $transformer): array
Erzeugt ein neues Array durch Umwandlung der Werte und Schlüssel des ursprünglichen Arrays. Die Funktion
$transformer
hat die Signatur function ($value, $key, array $array): ?array{$newValue, $newKey}
. Wenn
$transformer
null
zurückgibt, wird das Element übersprungen. Bei beibehaltenen Elementen wird das
erste Element des zurückgegebenen Arrays als neuer Schlüssel und das zweite Element als neuer Wert verwendet.
$array = ['a' => 1, 'b' => 2, 'c' => 3];
$result = Arrays::mapWithKeys($array, fn($v, $k) => $v > 1 ? [$v * 2, strtoupper($k)] : null);
// [4 => 'B']
Diese Methode ist in Situationen nützlich, in denen Sie die Struktur eines Arrays (Schlüssel und Werte gleichzeitig) ändern oder Elemente während der Transformation filtern müssen (indem Sie für unerwünschte Elemente null zurückgeben).
mergeTree(array $array1, array $array2): array
Führt zwei Felder rekursiv zusammen. Er ist z.B. nützlich, um Baumstrukturen zusammenzuführen. Er verhält sich wie der
+
-Operator für Array, d.h. er fügt ein Schlüssel/Wert-Paar aus dem zweiten Array zum ersten hinzu und behält den
Wert aus dem ersten Array im Falle einer Schlüsselkollision bei.
$array1 = ['color' => ['favorite' => 'red'], 5];
$array2 = [10, 'color' => ['favorite' => 'green', 'blue']];
$array = Arrays::mergeTree($array1, $array2);
// $array = ['color' => ['favorite' => 'red', 'blue'], 5];
Werte aus dem zweiten Array werden immer an das erste angehängt. Das Verschwinden des Wertes 10
aus dem zweiten
Array mag ein wenig verwirrend erscheinen. Es sollte beachtet werden, dass dieser Wert sowie der Wert 5
in the first
array have the same numeric key 0
, also im resultierenden Feld nur ein Element aus dem ersten Array
vorhanden ist.
normalize(array $array, ?string $filling=null): array
Normalisiert ein Array zu einem assoziativen Array. Ersetzen Sie numerische Schlüssel durch ihre Werte, der neue Wert wird
$filling
sein.
$array = Arrays::normalize([1 => 'first', 'a' => 'second']);
// $array = ['first' => null, 'a' => 'second'];
$array = Arrays::normalize([1 => 'first', 'a' => 'second'], 'foobar');
// $array = ['first' => 'foobar', 'a' => 'second'];
pick(array &$array, string|int $key, ?mixed $default=null): mixed
Liefert und entfernt den Wert eines Elements aus einem Array. Wenn es nicht existiert, wird eine Exception geworfen oder
$default
zurückgegeben, falls angegeben.
$array = [1 => 'foo', null => 'bar'];
$a = Arrays::pick($array, null);
// $a = 'bar'
$b = Arrays::pick($array, 'not-exists', 'foobar');
// $b = 'foobar'
$c = Arrays::pick($array, 'not-exists');
// throws Nette\InvalidArgumentException
renameKey(array &$array, string|int $oldKey, string|int $newKey): bool
Benennt einen Schlüssel um. Gibt true
zurück, wenn der Schlüssel im Array gefunden wurde.
$array = ['first' => 10, 'second' => 20];
Arrays::renameKey($array, 'first', 'renamed');
// $array = ['renamed' => 10, 'second' => 20];
getKeyOffset(array $array, string|int $key): ?int
Gibt die null-indizierte Position des angegebenen Array-Schlüssels zurück. Gibt null
zurück, wenn der
Schlüssel nicht gefunden wird.
$array = ['first' => 10, 'second' => 20];
$position = Arrays::getKeyOffset($array, 'first'); // returns 0
$position = Arrays::getKeyOffset($array, 'second'); // returns 1
$position = Arrays::getKeyOffset($array, 'not-exists'); // returns null
some(array $array, callable $predicate): bool
Prüft, ob mindestens ein Element im Array den Test besteht, der durch den angegebenen Callback mit der Signatur
function ($value, $key, array $array): bool
implementiert wird.
$array = [1, 2, 3, 4];
$isEven = fn($value) => $value % 2 === 0;
$res = Arrays::some($array, $isEven); // true
Siehe every().
toKey(mixed $key): string|int
Konvertiert einen Wert in einen Array-Schlüssel, der entweder eine Ganzzahl oder eine Zeichenkette ist.
Arrays::toKey('1'); // 1
Arrays::toKey('01'); // '01'
toObject(iterable $array, object $object): object
Kopiert die Elemente des Arrays $array
in das Objekt $object
und gibt es dann zurück.
$obj = new stdClass;
$array = ['foo' => 1, 'bar' => 2];
Arrays::toObject($array, $obj); // it sets $obj->foo = 1; $obj->bar = 2;
wrap(array $array, string
$prefix=''
, string $suffix=''
): array
Jedes Element des Arrays wird in einen String umgewandelt und mit $prefix
und $suffix
umschlossen.
$array = Arrays::wrap(['a' => 'red', 'b' => 'green'], '<<', '>>');
// $array = ['a' => '<<red>>', 'b' => '<<green>>'];
ArrayHash
Das Objekt Nette\Utils\ArrayHash ist ein Nachkomme der generischen Klasse stdClass und erweitert diese um die Möglichkeit, sie als Array zu behandeln, z. B. den Zugriff auf Mitglieder mit eckigen Klammern:
$hash = new Nette\Utils\ArrayHash;
$hash['foo'] = 123;
$hash->bar = 456; // funktioniert auch in Objektnotation
$hash->foo; // 123
Sie können die Funktion count($hash)
verwenden, um die Anzahl der Elemente zu ermitteln.
Sie können über ein Objekt wie über ein Array iterieren, sogar mit einer Referenz:
foreach ($hash as $key => $value) {
// ...
}
foreach ($hash as $key => &$value) {
$value = 'new value';
}
Vorhandene Arrays können mit from()
in ArrayHash
umgewandelt werden:
$array = ['foo' => 123, 'bar' => 456];
$hash = Nette\Utils\ArrayHash::from($array);
$hash->foo; // 123
$hash->bar; // 456
Die Umwandlung ist rekursiv:
$array = ['foo' => 123, 'inner' => ['a' => 'b']];
$hash = Nette\Utils\ArrayHash::from($array);
$hash->inner; // Objekt ArrayHash
$hash->inner->a; // 'b'
$hash['inner']['a']; // 'b'
Sie kann durch den zweiten Parameter vermieden werden:
$hash = Nette\Utils\ArrayHash::from($array, false);
$hash->inner; // array
Zurück in das Array transformieren:
$array = (array) $hash;
ArrayList
Nette\Utils\ArrayList stellt ein lineares Array dar, bei dem die Indizes nur ganze Zahlen sind, die von 0 an aufsteigen.
$list = new Nette\Utils\ArrayList;
$list[] = 'a';
$list[] = 'b';
$list[] = 'c';
// ArrayList(0 => 'a', 1 => 'b', 2 => 'c')
count($list); // 3
Sie können die Funktion count($list)
verwenden, um die Anzahl der Elemente zu ermitteln.
Sie können über ein Objekt wie über ein Array iterieren, sogar mit einem Verweis:
foreach ($list as $key => $value) {
// ...
}
foreach ($list as $key => &$value) {
$value = 'neuer Wert';
}
Vorhandene Arrays können mit from()
in ArrayList
umgewandelt werden:
$array = ['foo', 'bar'];
$list = Nette\Utils\ArrayList::from($array);
Der Zugriff auf Schlüssel, die über die zulässigen Werte hinausgehen, führt zu einer Ausnahme
Nette\OutOfRangeException
:
echo $list[-1]; // throws Nette\OutOfRangeException
unset($list[30]); // throws Nette\OutOfRangeException
Das Entfernen des Schlüssels führt zu einer Neunummerierung der Elemente:
unset($list[1]);
// ArrayList(0 => 'a', 1 => 'c')
Mit prepend()
können Sie ein neues Element an den Anfang setzen:
$list->prepend('d');
// ArrayList(0 => 'd', 1 => 'a', 2 => 'c')