Nie ma korelacji między numerycznymi i asocjacyjnymi kluczami indeksu.
Kiedy mówisz, że chcesz ustawić wartość tablicy asocjacyjnej za pomocą indeksu tablicy klucza / wartości , musisz użyć danego klucza, ustawienie $array[1]nie jest tym samym, co ustawienie $array['foo'].
Rozważ tę tablicę
print_r( array('foo', 'foo' => 'bar', 'baz', 'some' => 'value') );
To da
Array
(
[0] => foo
[foo] => bar
[1] => baz
[some] => value
)
Foo jest drugim elementem tablicy. To jest przesunięcie , ale nie ma to nic wspólnego z indeksem 1. Jak widać, w powyższej tablicy, indeks 1 jest powiązany baz. Błędem jest zakładanie, że tylko dlatego, że foojest pierwszym kluczem asocjacyjnym, ma on cokolwiek wspólnego z rzeczywistym kluczem numerycznym 1. Tak jak somenie koreluje z 2.
Podobnie w przypadku tablicy mieszanej, jak pokazano powyżej, rozwiązanie z array_keyssugerowanym w innym miejscu tej witryny nie będzie działać, ponieważ
print_r( array_keys(array('foo', 'foo' => 'bar', 'baz', 'some' => 'value')) );
da
Array
(
[0] => 0
[1] => foo
[2] => 1
[3] => some
)
Więc kiedy to robisz $array[$keys[1]], naprawdę robisz $array['foo']. Ale jeśli chcesz uzyskać dostęp do drugiej wartości asocjacyjnej w tej tablicy ( 'some'), nie możesz tego zrobić, $array[$keys[2]]ponieważ to dałoby wynik $array[1]i to jest baz.
Przesunięcie elementu jest całkowicie niezwiązane z jego kluczem lub wartością
print_r(
array(
100 => 'foo',
'foo' => 'bar',
50 => 'baz',
'some' => 'value'
)
);
naprawdę znaczy
Array
(
[100] => foo
[foo] => bar
[50] => baz
[some] => value
)
co oznacza, że element pod offsetem 0 to foo, chociaż jego klucz to 100. Jeśli chcesz wyodrębnić elementy z tablicy przez przesunięcie, musisz użyć
$third = array_splice($array, 2, 1);
echo $third[0];
Utworzyłoby to tablicę zawierającą tylko element na trzeciej pozycji.
Lub możesz użyć ArrayIterator. W ArrayIteratorimplementuje Seekableinterfejs, który pozwala dążyć do położenia szczególnego / przesunięcie w tablicy, a następnie sprowadzić że:
$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current();