Funzioni della matrice

Questa pagina tratta delle classi Nette\Utils\Arrays, ArrayHash e ArrayList, relative agli array.

Installazione:

composer require nette/utils

Array

Nette\Utils\Arrays è una classe statica che contiene una manciata di pratiche funzioni per gli array. Il suo equivalente per gli iteratori è Nette\Utils\Iterables.

Gli esempi seguenti presuppongono che sia definito il seguente alias di classe:

use Nette\Utils\Arrays;

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

La funzione trasforma in modo flessibile l'oggetto $array in un array associativo o in oggetti secondo il percorso specificato $path. Il percorso può essere una stringa o un array. È costituito dai nomi delle chiavi dell'array di input e da operatori come ‘[]’, ‘->’, ‘=’ e ‘|’. Lancia Nette\InvalidArgumentException se il percorso non è valido.

// Conversione in un array associativo con una chiave semplice
$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]]
// assegnare valori da una chiave a un'altra utilizzando l'operatore =
$result = Arrays::associate($arr, 'name=age'); // o ['name', '=', 'age']
// $result = ['John' => 11, 'Mary' => null, ...]
// creare un oggetto utilizzando l'operatore ->
$result = Arrays::associate($arr, '->name'); // o ['->', 'name']
// $result = (object) ['John' => ['name' => 'John', 'age' => 11], 'Mary' => ['name' => 'Mary', 'age' => null]]
// combinando le chiavi con l'operatore |
$result = Arrays::associate($arr, 'name|age'); // oppure ['name', '|', 'age']
// $result: ['John' => ['name' => 'John', 'age' => 11], 'Paul' => ['name' => 'Paul', 'age' => 44]]
// aggiungere a un array usando []
$result = Arrays::associate($arr, 'name[]'); // oppure ['name', '[]']
// $result: ['John' => [['name' => 'John', 'age' => 22], ['name' => 'John', 'age' => 11]]]

contains (array $array, $value)bool

Verifica la presenza di un valore in un array. Utilizza un confronto rigoroso (===)

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

every (array $array, callable $predicate)bool

Verifica se tutti gli elementi dell'array superano il test implementato dalla funzione fornita, che ha la firma function ($value, $key, array $array): bool.

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

Vedere some().

filter (array $array, callable $predicate)array

Restituisce un nuovo array contenente tutte le coppie chiave-valore corrispondenti al dato $predicate. Il callback ha la firma 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

Restituisce il primo elemento (che corrisponde al predicato specificato, se dato). Se non esiste un elemento, restituisce il risultato dell'invocazione di $else o null.
$predicate ha la firma function ($value, int|string $key, array $array): bool.

Non modifica il puntatore interno, a differenza di reset(). I parametri $predicate e $else esistono dalla versione 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

Vedere last().

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

Restituisce la chiave del primo elemento (che corrisponde al predicato specificato, se dato) o null se non esiste un elemento. $predicate ha la firma 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

Vedere lastKey().

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

Trasforma un array multidimensionale in un array piatto.

$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

Restituisce $array[$key] item. Se non esiste, viene lanciato Nette\InvalidArgumentException, a meno che non venga impostato un valore predefinito come terzo parametro.

// se $array['foo'] non esiste, lancia un'eccezione
$value = Arrays::get($array, 'foo');

// se $array['foo'] non esiste, restituisce 'bar'
$value = Arrays::get($array, 'foo', 'bar');

L'argomento $key può anche essere un array.

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

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

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

Ottiene il riferimento al dato $array[$key]. Se l'indice non esiste, ne viene creato uno nuovo con il valore null.

$valueRef = & Arrays::getRef($array, 'foo');
// restituisce il riferimento a $array['foo'].

Funziona con gli array multidimensionali e con get().

$value = & Arrays::get($array, ['colore', 'preferito']);
// restituisce il riferimento $array['colore']['preferito']

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

Restituisce solo gli elementi dell'array che corrispondono a un'espressione regolare $pattern. Se $invert è true, restituisce gli elementi che non corrispondono. Un errore di compilazione o di esecuzione della Regex lancia Nette\RegexpException.

$filteredArray = Arrays::grep($array, '~^\d+$~');
// restituisce solo elementi numerici

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

Inserisce il contenuto dell'array $inserted nell'array $array immediatamente dopo $key. Se $key è null (o non esiste), viene inserito alla fine.

$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

Inserisce il contenuto della matrice $inserted in $array prima di $key. Se $key è null (o non esiste), viene inserito all'inizio.

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

invoke (iterable $callbacks, …$args)array

Invoca tutti i callback e restituisce un array di risultati.

$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

Invoca il metodo su ogni oggetto di un array e restituisce un array di risultati.

$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

Verifica se l'array è indicizzato in ordine crescente di chiavi numeriche a partire da zero, ovvero un elenco.

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

Restituisce l'ultimo elemento (che corrisponde al predicato specificato, se dato). Se non esiste un elemento, restituisce il risultato dell'invocazione di $else o null.
$predicate ha la firma function ($value, int|string $key, array $array): bool.

Non modifica il puntatore interno, a differenza di end(). I parametri $predicate e $else esistono dalla versione 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

Vedere prima().

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

Restituisce la chiave dell'ultimo elemento (che corrisponde al predicato specificato, se dato) o null se non esiste un elemento. $predicate ha la firma 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

Vedere firstKey().

map (array $array, callable $transformer)array

Richiama $transformer su tutti gli elementi dell'array e restituisce l'array dei valori di ritorno. Il callback ha la firma 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

Crea un nuovo array trasformando i valori e le chiavi dell'array originale. La funzione $transformer ha la firma function ($value, $key, array $array): ?array{$newValue, $newKey}. Se $transformer restituisce null, l'elemento viene saltato. Per gli elementi mantenuti, il primo elemento dell'array restituito viene utilizzato come nuova chiave e il secondo elemento come nuovo valore.

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

Questo metodo è utile nelle situazioni in cui è necessario modificare la struttura di un array (sia le chiavi che i valori contemporaneamente) o filtrare gli elementi durante la trasformazione (restituendo null per gli elementi indesiderati).

mergeTree (array $array1, array $array2)array

Unisce ricorsivamente due campi. È utile, ad esempio, per unire strutture ad albero. Si comporta come l'operatore `+' per gli array, cioè aggiunge una coppia chiave/valore dal secondo array al primo e mantiene il valore dal primo array nel caso di una collisione di chiavi.

$array1 = ['colore' => ['preferito' => 'rosso'], 5];
$array2 = [10, 'colore' => ['preferito' => 'verde', 'blu']];

$array = Arrays::mergeTree($array1, $array2);
// $array = ['colore' => ['preferito' => 'rosso', 'blu'], 5];

I valori del secondo array vengono sempre aggiunti al primo. La scomparsa del valore 10 dal secondo array può sembrare un po' confusa. Va notato che questo valore, così come il valore 5 in the first array have the same numeric key 0, quindi nel campo risultante c'è solo un elemento del primo array.

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

Normalizza l'array in un array associativo. Sostituisce le chiavi numeriche con i loro valori, il nuovo valore sarà $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

Restituisce e rimuove il valore di un elemento da un array. Se non esiste, lancia un'eccezione o restituisce $default, se fornito.

$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

Rinomina una chiave. Restituisce true se la chiave è stata trovata nell'array.

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

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

Restituisce la posizione a indice zero della chiave dell'array dato. Restituisce null se la chiave non viene trovata.

$array = ['first' => 10, 'second' => 20];
$position = Arrays::getKeyOffset($array, 'first'); // restituisce 0
$position = Arrays::getKeyOffset($array, 'second'); // restituisce 1
$position = Arrays::getKeyOffset($array, 'not-exists'); // restituisce null

some (array $array, callable $predicate)bool

Verifica se almeno un elemento dell'array supera il test implementato dal callback fornito con la firma function ($value, $key, array $array): bool.

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

Vedere every().

toKey (mixed $key): string|int

Converte un valore in una chiave di array, che può essere un intero o una stringa.

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

toObject (iterable $array, object $object)object

Copia gli elementi dell'array $array nell'oggetto $object e lo restituisce.

$obj = new stdClass;
$array = ['foo' => 1, 'bar' => 2];
Arrays::toObject($array, $obj); // imposta $obj->foo = 1; $obj->bar = 2;

wrap (array $array, string $prefix='', string $suffix='')array

Lancia ogni elemento dell'array come stringa e lo racchiude con $prefix e $suffix.

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

ArrayHash

L'oggetto Nette\Utils\ArrayHash è il discendente della classe generica stdClass e la estende alla possibilità di trattarla come un array, ad esempio accedendo ai membri usando le parentesi quadre:

$hash = new Nette\Utils\ArrayHash;
$hash['foo'] = 123;
$hash->bar = 456; // funziona anche in notazione oggetto
$hash->foo; // 123

È possibile utilizzare la funzione count($hash) per ottenere il numero di elementi.

È possibile iterare su un oggetto come su un array, anche con un riferimento:

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

foreach ($hash as $key => &$value) {
	$value = 'nuovo valore';
}

Gli array esistenti possono essere trasformati in ArrayHash utilizzando from():

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

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

La trasformazione è ricorsiva:

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

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

Può essere evitata con il secondo parametro:

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

Trasformazione in array:

$array = (array) $hash;

ArrayList

Nette\Utils\ArrayList rappresenta un array lineare in cui gli indici sono solo numeri interi ascendenti a partire da 0.

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

È possibile utilizzare la funzione count($list) per ottenere il numero di elementi.

È possibile iterare su un oggetto come su un array, anche con un riferimento:

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

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

Gli array esistenti possono essere trasformati in ArrayList utilizzando from():

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

L'accesso alle chiavi oltre i valori consentiti lancia un'eccezione Nette\OutOfRangeException:

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

La rimozione della chiave comporta la rinumerazione degli elementi:

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

È possibile aggiungere un nuovo elemento all'inizio utilizzando prepend():

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