Chcę ustawić wartość tablicy asocjacyjnej przy użyciu indeksu tablicy pary klucz / wartość. Na przykład:
$my_arr = array( "bling" => "some bling", "bling2" => "lots O bling" );
$my_arr[1] = "not so much bling"; // Would change the value with key bling2.
Jak można to osiągnąć bez użycia ciągu kluczy?
name of the student
.without using a key string
.array[1] === $array['foo']
że. Tablica może nadal zawierać inną wartość w$array[1]
. Zauważ, że nie twierdzę, że twoje rozwiązanie jest złe. To założenie OP.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, żefoo
jest pierwszym kluczem asocjacyjnym, ma on cokolwiek wspólnego z rzeczywistym kluczem numerycznym 1. Tak jaksome
nie koreluje z 2.Podobnie w przypadku tablicy mieszanej, jak pokazano powyżej, rozwiązanie z
array_keys
sugerowanym 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 jestbaz
.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 ( //key value offset/position [100] => foo // 0 [foo] => bar // 1 [50] => baz // 2 [some] => value // 3 )
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]; // baz
Utworzyłoby to tablicę zawierającą tylko element na trzeciej pozycji.
Lub możesz użyć
ArrayIterator
. WArrayIterator
implementujeSeekable
interfejs, 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(); // value
źródło
array_keys
. Nie ma takiej encji jak „klucz niezespolony”. Jeśli chciałeś zwrócić uwagę, że nie możesz zwrócić drugiego klucza łańcucha (zakładając, że tablica kluczy zawiera tylko łańcuchy), to to, co mówisz, jest poprawne.$stringKeys = array_filter(array_keys($array), "is_string");
daje klucze ciągów.Chociaż
array_keys()
zezwala na dostęp do n-tego klucza,array_values
daje n-tą wartość.<?php $array = [ 0 => 'Zero', '1' => 'One', 'Two' => 'Two', ]; echo array_values($array)[2]; ?>
wyświetli „Dwa”.
Czy istnieje przewaga jednego nad drugim? Cóż, jedyny pomniejszy, jaki widzę, to liczba dostępów do tablicy.
Ze
array_keys()
trzeba 3.Dzięki
array_values()
, potrzebujesz tylko 2.Ale z drugiej strony klucze są zwykle mniejsze, a dane mogą być bardzo zagnieżdżone, więc ogólnie rzecz biorąc, używanie klucza
array_keys()
jest prawdopodobnie bezpieczniejsze.źródło
Jeśli tablica jest duża, oba
array_keys
iarray_values
będą marnotrawstwem, ponieważ przydzielą nową tablicę o tym samym rozmiarze co oryginalna, aby uzyskać n-ty klucz (lub wartość).array_slice
akceptuje przesunięcie w postaci liczby całkowitej i działa na tablicach asocjacyjnych. Możesz go użyć, aby pobrać (i ustawić) n-ty klucz w stałym czasie.// This will at most allocate 2 temporary arrays of 1 element each $key = array_keys(array_slice($array, $n, 1, true))[0]; $array[$key] = $value;
źródło
Spróbuj tego. To działa dla Ciebie.
$result= array_values($my_arr); // Array with indexes you need
źródło
Inną możliwością jest przekonwertowanie go na zwykłą tablicę:
Gdzie „~~~” jest ogranicznikiem, który nie występuje w danych.
Teraz możesz uzyskać dostęp do tablicy za pomocą indeksów numerycznych równych przesunięciom.
Jeśli nadal chcesz zachować tablicę asocjacyjną, po prostu przypisz ją do innej zmiennej.
źródło