Non esiste alcuna correlazione tra le chiavi di indice numeriche e associative.
Quando dici di voler impostare il valore di un array associativo usando l'indice dell'array della chiave / valore , allora devi usare la chiave data, l'impostazione $array[1]non è la stessa dell'impostazione $array['foo'].
Considera questo array
print_r( array('foo', 'foo' => 'bar', 'baz', 'some' => 'value') );
Questo darà
Array
(
[0] => foo
[foo] => bar
[1] => baz
[some] => value
)
Il foo è il secondo elemento dell'array. Questo è l' offset , ma non ha nulla a che fare con l'indice 1. Come puoi vedere, in quell'array sopra, l'indice 1 è associato baz. È sbagliato presumere che, proprio perché fooè la prima chiave associativa, abbia qualcosa a che fare con la chiave numerica reale 1. Proprio come somenon è correlato a 2.
Allo stesso modo, per un array misto come mostrato sopra, la soluzione array_keyssuggerita altrove su questo sito non funzionerà, perché
print_r( array_keys(array('foo', 'foo' => 'bar', 'baz', 'some' => 'value')) );
darà
Array
(
[0] => 0
[1] => foo
[2] => 1
[3] => some
)
Quindi quando lo fai $array[$keys[1]]lo stai facendo davvero $array['foo']. Ma se volessi accedere al secondo valore associativo in quell'array ( 'some'), non puoi farlo $array[$keys[2]]perché verrebbe valutato $array[1]e questo baz.
L'offset di un elemento non è completamente correlato alla sua chiave o valore
print_r(
array(
100 => 'foo',
'foo' => 'bar',
50 => 'baz',
'some' => 'value'
)
);
significa davvero
Array
( //key value offset/position
[100] => foo // 0
[foo] => bar // 1
[50] => baz // 2
[some] => value // 3
)
il che significa che l'elemento all'offset 0 è foo sebbene la chiave sia 100. Se vuoi estrarre elementi da un array per offset, devi usare
$third = array_splice($array, 2, 1);
echo $third[0]; // baz
Questo creerebbe un array che contiene solo l'elemento nella terza posizione.
Oppure potresti usare un file ArrayIterator. Le ArrayIteratorimplementa Seekableun'interfaccia che consente di cercare una posizione specifica / Offset nella matrice e quindi del recupero:
$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current(); // value