Ricerca…


SplFixedArray

Differenza dalla matrice PHP

Il tipo di array predefinito di PHP è in realtà implementato come mappe hash ordinate, che ci consentono di creare array costituiti da coppie chiave / valore in cui i valori possono essere di qualsiasi tipo e le chiavi possono essere numeri o stringhe. Questo non è tradizionalmente come vengono creati gli array, comunque.

Array PHP tradizionale Figura 1

Quindi, come puoi vedere da questa illustrazione, un normale array PHP può essere visualizzato più come un insieme ordinato di coppie chiave / valore, in cui ogni chiave può essere mappata a qualsiasi valore. Notate in questo array che abbiamo chiavi che sono sia numeri che stringhe, così come valori di diversi tipi e che la chiave non ha alcun rapporto con l'ordine degli elementi.

$arr = [
    9     => "foo",
    1     => 4.2,
    "bar" => null,
];

foreach($arr as $key => $value) {
    echo "$key => $value\n";
}

Quindi il codice sopra ci darebbe esattamente quello che ci aspetteremmo.

9 => foo
1 => 4.2
bar => 

Gli array PHP regolari sono anche dimensionati dinamicamente per noi. Crescono e si restringono quando spingiamo e scarichiamo i valori da e verso l'array, automaticamente.


Tuttavia, in un array tradizionale la dimensione è fissa e consiste interamente dello stesso tipo di valore. Inoltre, anziché le chiavi, ogni valore è accessibile dal suo indice, che può essere dedotto dal suo offset nell'array.

SplFixedArray Figura 2

Poiché dovremmo conoscere la dimensione di un determinato tipo e la dimensione fissa della matrice, un offset è quindi la type size * n del type size * n erano n rappresenta la posizione del valore nella matrice. Quindi nell'esempio sopra $arr[0] ci dà 1 , il primo elemento dell'array e $arr[1] ci dà 2 , e così via.

SplFixedArray, tuttavia, non limita il tipo di valori. Limita solo le chiavi ai tipi di numeri. È anche di dimensioni fisse.

Ciò rende SplFixedArrays più efficiente dei normali array PHP in un modo particolare. Sono più compatti e richiedono meno memoria.

Istanziare la matrice

SplFixedArray è implementato come un oggetto, ma è possibile accedervi con la stessa sintassi familiare che si accede a un normale array PHP poiché implementano l'interfaccia ArrayAccess . Implementano anche interfacce Countable e Iterator modo che si comportino nello stesso modo in cui verrebbero utilizzati per gli array che si comportano in PHP (ad esempio cose come count($arr) e foreach($arr as $k => $v) funzionano allo stesso modo per SplFixedArray come fanno gli array normali in PHP.

Il costruttore SplFixedArray accetta un argomento, che è la dimensione della matrice.

$arr = new SplFixedArray(4);

$arr[0] = "foo";
$arr[1] = "bar";
$arr[2] = "baz";

foreach($arr as $key => $value) {
    echo "$key => $value\n";
}

Questo ti dà quello che ti aspetteresti.

0 => foo
1 => bar
2 => baz
3 => 

Anche questo funziona come previsto.

var_dump(count($arr));

Ci da...

int(4)

Nota in SplFixedArray, diversamente da un normale array PHP, la chiave descrive l'ordine dell'elemento nel nostro array, perché è un indice vero e non solo una mappa .

Ridimensionamento dell'array

Tieni presente che, poiché la matrice ha una dimensione fissa, il conteggio restituirà sempre lo stesso valore. Quindi, mentre unset($arr[1]) risulterà in $arr[1] === null , count($arr) rimane ancora 4 .

Quindi per ridimensionare l'array dovrai chiamare il metodo setSize .

$arr->setSize(3);

var_dump(count($arr));

foreach($arr as $key => $value) {
    echo "$key => $value\n";
}

Ora otteniamo ...

int(3)
0 => foo
1 => 
2 => baz

Importa in SplFixedArray ed esporta da SplFixedArray

È inoltre possibile importare / esportare un normale array PHP dentro e fuori un SplFixedArray con i metodi fromArray e toArray .

$array      = [1,2,3,4,5];
$fixedArray = SplFixedArray::fromArray($array);

foreach($fixedArray as $value) {
    echo $value, "\n";
}
1
2
3
4
5

Andando dall'altra parte

$fixedArray = new SplFixedArray(5);

$fixedArray[0] = 1;
$fixedArray[1] = 2;
$fixedArray[2] = 3;
$fixedArray[3] = 4;
$fixedArray[4] = 5;

$array = $fixedArray->toArray();

foreach($array as $value) {
    echo $value, "\n";
}
1
2
3
4
5


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow