Fonctions des tableaux

Cette page concerne les classes Nette\Utils\Arrays, ArrayHash et ArrayList, qui sont liées aux tableaux.

Installation :

composer require nette/utils

Matrices

Nette\Utils\Arrays est une classe statique qui contient une poignée de fonctions pratiques pour les tableaux. Son équivalent pour les itérateurs est Nette\Utils\Iterables.

Les exemples suivants supposent que l'alias de classe suivant est défini :

use Nette\Utils\Arrays;

associate (array $array, mixed $path): array|\stdClass

La fonction transforme de manière flexible le fichier $array en un tableau associatif ou en objets selon le chemin spécifié $path. Le chemin peut être une chaîne ou un tableau. Il se compose des noms des clés du tableau d'entrée et d'opérateurs tels que “[]”, “->”, “=” et “|”. Lance Nette\InvalidArgumentException si le chemin n'est pas valide.

// conversion en tableau associatif à l'aide d'une simple clé
$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]]
// l'affectation de valeurs d'une clé à une autre à l'aide de l'opérateur =.
$result = Arrays::associate($arr, 'name=age'); // ou ['name', '=', 'age']
// $result = ['John' => 11, 'Mary' => null, ...]
// création d'un objet à l'aide de l'opérateur ->
$result = Arrays::associate($arr, '->name'); // ou ['->', 'name']
// $result = (object) ['John' => ['name' => 'John', 'age' => 11], 'Mary' => ['name' => 'Mary', 'age' => null]]
// combiner des clés à l'aide de l'opérateur |
$result = Arrays::associate($arr, 'name|age'); // ou ['name', '|', 'age']
// $result: ['John' => ['name' => 'John', 'age' => 11], 'Paul' => ['name' => 'Paul', 'age' => 44]]
// ajouter à un tableau en utilisant []
$result = Arrays::associate($arr, 'name[]'); // ou ['name', '[]']
// $result: ['John' => [['name' => 'John', 'age' => 22], ['name' => 'John', 'age' => 11]]]

contains (array $array, $value)bool

Teste un tableau pour vérifier la présence d'une valeur. Utilise une comparaison stricte (===)

Arrays::contains([1, 2, 3], 1);    // true
Arrays::contains(['1', false], 1); // false

every (array $array, callable $predicate)bool

Teste si tous les éléments du tableau passent le test implémenté par la fonction fournie, qui a la signature function ($value, $key, array $array): bool.

$array = [1, 30, 39, 29, 10, 13];
$isBelowThreshold = fn($value) => $value < 40;
$res = Arrays::every($array, $isBelowThreshold); // true

Voir some().

filter (array $array, callable $predicate)array

Renvoie un nouveau tableau contenant toutes les paires clé-valeur correspondant à l'adresse $predicate. Le rappel a la signature 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

Renvoie le premier élément (correspondant au prédicat spécifié s'il est donné). S'il n'y a pas d'élément de ce type, il renvoie le résultat de l'invocation de $else ou null. Le site $predicate a la signature function ($value, int|string $key, array $array): bool.

Il ne modifie pas le pointeur interne, contrairement à reset(). Les paramètres $predicate et $else existent depuis la 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

Voir last().

firstKey (array $array, ?callable $predicate=null): int|string|null

Renvoie la clé du premier élément (correspondant au prédicat spécifié s'il est donné) ou null s'il n'y a pas d'élément de ce type. La signature de $predicate est 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

Voir lastKey().

flatten (array $array, bool $preserveKeys=false)array

Transforme un tableau multidimensionnel en tableau plat.

$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

Retourne $array[$key] item. S'il n'existe pas, Nette\InvalidArgumentException est lancé, sauf si une valeur par défaut est définie comme troisième argument.

// si $array['foo'] n'existe pas, lance une exception
$value = Arrays::get($array, 'foo');

// si $array['foo'] n'existe pas, retourne 'bar'.
$value = Arrays::get($array, 'foo', 'bar');

L'argument $key peut aussi bien être un tableau.

$array = ['color' => ['favorite' => 'red'], 5];

$value = Arrays::get($array, ['color', 'favorite']);
// returns 'red'

getRef (array &$array, string|int|array $key)mixed

Obtient une référence à l'objet $array[$key]. Si l'index n'existe pas, un nouvel index est créé avec la valeur null.

$valueRef = & Arrays::getRef($array, 'foo');
// renvoie une référence à $array['foo'].

Fonctionne avec les tableaux multidimensionnels ainsi qu'avec get().

$value = & Arrays::get($array, ['color', 'favorite']);
// renvoie la référence $array['color']['favorite'].

grep (array $array, string $pattern, bool $invert=false)array

Renvoie uniquement les éléments du tableau qui correspondent à l'expression régulière $pattern. Si $invert est true, il renvoie les éléments qui ne correspondent pas. Une erreur de compilation ou d'exécution de l'expression régulière entraîne le lancement de Nette\RegexpException.

$filteredArray = Arrays::grep($array, '~^\d+$~');
// renvoie uniquement les éléments numériques

insertAfter (array &$array, string|int|null $key, array $inserted)void

Insère le contenu du tableau $inserted dans le tableau $array immédiatement après le tableau $key. Si $key est null (ou n'existe pas), il est inséré à la fin.

$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

Insère le contenu du tableau $inserted dans le fichier $array avant le fichier $key. Si $key est null (ou n'existe pas), il est inséré au début.

$array = ['first' => 10, 'second' => 20];
Arrays::insertBefore($array, 'first', ['hello' => 'world']);
// $array = ['hello' => 'world', 'first' => 10, 'second' => 20];

invoke (iterable $callbacks, …$args)array

Appelle tous les callbacks et renvoie un tableau de résultats.

$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

Appelle la méthode sur chaque objet d'un tableau et renvoie un tableau de résultats.

$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

Vérifie si le tableau est indexé dans l'ordre croissant des clés numériques à partir de zéro, c'est-à-dire une 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

Renvoie le dernier élément (correspondant au prédicat spécifié, le cas échéant). S'il n'existe pas d'élément de ce type, il renvoie le résultat de l'invocation de $else ou null. Le site $predicate a la signature function ($value, int|string $key, array $array): bool.

Il ne modifie pas le pointeur interne, contrairement à end(). Les paramètres $predicate et $else existent depuis la 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

Voir first().

lastKey (array $array, ?callable $predicate=null): int|string|null

Renvoie la clé du dernier élément (correspondant au prédicat spécifié s'il est donné) ou null s'il n'y a pas d'élément de ce type. La signature de $predicate est 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

Voir firstKey().

map (array $array, callable $transformer)array

Appelle $transformer sur tous les éléments du tableau et renvoie le tableau des valeurs de retour. Le callback a la signature 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

Crée un nouveau tableau en transformant les valeurs et les clés du tableau original. La fonction $transformer a pour signature function ($value, $key, array $array): ?array{$newValue, $newKey}. Si $transformer renvoie null, l'élément est ignoré. Pour les éléments conservés, le premier élément du tableau retourné est utilisé comme nouvelle clé et le deuxième élément comme nouvelle valeur.

$array = ['a' => 1, 'b' => 2, 'c' => 3];
$result = Arrays::mapWithKeys($array, fn($v, $k) => $v > 1 ? [$v * 2, strtoupper($k)] : null);
// [4 => 'B']

Cette méthode est utile dans les situations où vous devez modifier la structure d'un tableau (à la fois les clés et les valeurs) ou filtrer les éléments au cours de la transformation (en renvoyant null pour les éléments non souhaités).

mergeTree (array $array1, array $array2)array

Fusionne récursivement deux champs. Il est utile, par exemple, pour fusionner des structures arborescentes. Il se comporte comme l'opérateur + pour les tableaux, c'est-à-dire qu'il ajoute une paire clé/valeur du second tableau au premier et conserve la valeur du premier tableau en cas de collision de clés.

$array1 = ['color' => ['favorite' => 'red'], 5];
$array2 = [10, 'color' => ['favorite' => 'green', 'blue']];

$array = Arrays::mergeTree($array1, $array2);
// $array = ['color' => ['favorite' => 'red', 'blue'], 5];

Les valeurs du deuxième tableau sont toujours ajoutées au premier. La disparition de la valeur 10 du deuxième tableau peut sembler un peu déroutante. Il convient de noter que cette valeur, ainsi que la valeur 5 in the first array have the same numeric key 0, font que dans le champ résultant, il n'y a qu'un élément du premier tableau.

normalize (array $array, ?string $filling=null)array

Normalise le tableau en tableau associatif. Remplacez les clés numériques par leurs valeurs, la nouvelle valeur sera $filling.

$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

Renvoie et supprime la valeur d'un élément d'un tableau. S'il n'existe pas, il lève une exception, ou renvoie $default, s'il est fourni.

$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

Renomme une clé. Retourne true si la clé a été trouvée dans le tableau.

$array = ['first' => 10, 'second' => 20];
Arrays::renameKey($array, 'first', 'renamed');
// $array = ['renamed' => 10, 'second' => 20];

getKeyOffset (array $array, string|int $key)?int

Renvoie la position indexée zéro de la clé du tableau donné. Retourne null si la clé n'est pas trouvée.

$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

Teste si au moins un élément du tableau passe le test implémenté par la callback fournie avec la signature function ($value, $key, array $array): bool.

$array = [1, 2, 3, 4];
$isEven = fn($value) => $value % 2 === 0;
$res = Arrays::some($array, $isEven); // true

Voir every().

toKey (mixed $key): string|int

Convertit une valeur en une clé de tableau, qui est soit un entier, soit une chaîne de caractères.

Arrays::toKey('1');  // 1
Arrays::toKey('01'); // '01'

toObject (iterable $array, object $object)object

Copie les éléments du tableau $array dans l'objet $object, puis le renvoie.

$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

Il transforme chaque élément du tableau en chaîne de caractères et l'entoure de $prefix et $suffix.

$array = Arrays::wrap(['a' => 'red', 'b' => 'green'], '<<', '>>');
// $array = ['a' => '<<red>>', 'b' => '<<green>>'];

ArrayHash

L'objet Nette\Utils\ArrayHash est le descendant de la classe générique stdClass et l'étend à la possibilité de le traiter comme un tableau, par exemple en accédant aux membres à l'aide de crochets :

$hash = new Nette\Utils\ArrayHash;
$hash['foo'] = 123;
$hash->bar = 456; // also works object notation
$hash->foo; // 123

Vous pouvez utiliser la fonction count($hash) pour obtenir le nombre d'éléments.

Vous pouvez itérer sur un objet comme vous le feriez sur un tableau, même avec une référence :

foreach ($hash as $key => $value) {
	// ...
}

foreach ($hash as $key => &$value) {
	$value = 'nouvelle valeur' ;
}

Les tableaux existants peuvent être transformés en ArrayHash en utilisant from():

$array = ['foo' => 123, 'bar' => 456];

$hash = Nette\Utils\ArrayHash::from($array);
$hash->foo; // 123
$hash->bar; // 456

La transformation est récursive :

$array = ['foo' => 123, 'inner' => ['a' => 'b']];

$hash = Nette\Utils\ArrayHash::from($array);
$hash->inner; // object ArrayHash
$hash->inner->a; // 'b'
$hash['inner']['a']; // 'b'

Elle peut être évitée par le deuxième paramètre :

$hash = Nette\Utils\ArrayHash::from($array, false);
$hash->inner; // array

Transformer en retour au tableau :

$array = (array) $hash;

ArrayList

Nette\Utils\ArrayList représente un tableau linéaire où les index sont uniquement des entiers croissants à partir de 0.

$list = new Nette\Utils\ArrayList;
$list[] = 'a';
$list[] = 'b';
$list[] = 'c';
// ArrayList(0 => 'a', 1 => 'b', 2 => 'c')
count($list); // 3

Vous pouvez utiliser la fonction count($list) pour obtenir le nombre d'éléments.

Vous pouvez itérer sur un objet comme vous le feriez sur un tableau, même avec une référence :

foreach ($list as $key => $value) {
	// ...
}

foreach ($list as $key => &$value) {
	$value = 'nouvelle valeur' ;
}

Les tableaux existants peuvent être transformés en ArrayList en utilisant from():

$array = ['foo', 'bar'];
$list = Nette\Utils\ArrayList::from($array);

L'accès aux clés au-delà des valeurs autorisées déclenche une exception Nette\OutOfRangeException:

echo $list[-1]; // throws Nette\OutOfRangeException
unset($list[30]); // throws Nette\OutOfRangeException

La suppression de la clé entraîne la renumérotation des éléments :

unset($list[1]);
// ArrayList(0 => 'a', 1 => 'c')

Vous pouvez ajouter un nouvel élément au début en utilisant prepend():

$list->prepend('d');
// ArrayList(0 => 'd', 1 => 'a', 2 => 'c')
version: 4.0