Pytanie Dostęp do tablicy asocjacyjnej według indeksu całkowitoliczbowego w PHP


Chcę ustawić wartość asocjacyjnej tablicy 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 klucza?


76
2018-01-22 16:52


pochodzenie




Odpowiedzi:


Posługiwać się array_keys.

$keys = array_keys($my_arr);
$my_arr[$keys[1]] = "not so much bling";

Mam nadzieję że to pomoże.


162
2018-01-22 16:54



Działa jak marzenie. Dzięki. - Marty
Na marginesie, dlaczego twórcy PHP mieliby stworzyć tak nieintuicyjny sposób dostępu do tablicy? - Marty
@Marty ma to mniej wspólnego z tym, jak inżynierowie PHP go wdrożyli, ale bardziej z niezrozumieniem działania tablic. Technicznie powyższe nadal używa nazwy asocjacyjnej. Nie ma korelacji między kluczami indeksowymi i asocjacyjnymi. - Gordon
Tworzysz tablicę asocjacyjną, ponieważ to, czego szukasz, jest ważniejsze niż jej pozycja w tablicy. Myślę, że to dobry punkt. Załóżmy, że masz tablicę z nazwiskami uczniów jako kluczami i adresami jako wartościami. Możesz dotrzeć do adresu ucznia po jego nazwie. Pozycja tablicy jest nieistotna. I możesz posortować tablicę według name of the student. - Donovan
@Albert odwzorowujesz ten numer na odpowiedni ciąg kluczy. To nie oznacza tego array[1] === $array['foo'] chociaż. Tablica może nadal zawierać inną wartość at $array[1]. Zauważ, że nie mówię, że twoje rozwiązanie jest złe. Jest to założenie PO. - Gordon


Nie ma korelacji między kluczami indeksowymi i asocjacyjnymi.

Kiedy mówisz, że chcesz ustaw wartość tablicy asocjacyjnej za pomocą indeksu tablicy klucza / wartości, musisz użyć danego klucza, ustawienia $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 w tablicy. To jest offsetowy, ale nie ma to nic wspólnego z indeksem 1. Jak widać, w powyższej tablicy indeks 1 jest powiązany z baz. Błędem jest zakładać, że tylko dlatego foo jest pierwszym kluczem asocjacyjnym, który ma cokolwiek wspólnego z rzeczywistym kluczem numerycznym 1. Tak jak some nie koreluje z 2.

Podobnie, dla tablicy mieszanej, jak pokazano powyżej, rozwiązanie z array_keys sugerowane w innym miejscu na tej stronie 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 zrobisz $array[$keys[1]] naprawdę robisz $array['foo']. Ale jeśli chcesz uzyskać dostęp do drugiej asocjacyjnej wartości w tej tablicy ('some'), nie możesz zrobić $array[$keys[2]] ponieważ to by oceniło $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
( //key       value     offset/position
    [100]  => foo       // 0
    [foo]  => bar       // 1
    [50]   => baz       // 2
    [some] => value     // 3
)

co oznacza, że ​​element przy przesunięciu 0 jest 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

Spowoduje to utworzenie tablicy zawierającej tylko element na trzeciej pozycji.

Lub możesz użyć ArrayIterator. The ArrayIterator implementuje a Seekable interfejs, który pozwala szukać określonej pozycji / przesunięcia w tablicy, a następnie pobrać:

$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current(); // value

24
2018-01-22 17:22





Podczas array_keys() umożliwia dostęp do n-tego klucza, array_values da ci n-tą wartość.

<?php
$array = [
   0     => 'Zero',
   '1'   => 'One',
   'Two' => 'Two',
];
echo array_values($array)[2];
?>

wyświetli "Two".

Czy istnieje przewaga jednego nad drugim? Cóż, jedynym niewielkim, jaki widzę, jest liczba dostępów do tablicy.

Z array_keys() musisz 3.

  1. Uzyskaj klucze z tablicy danych.
  2. Uzyskaj n-ty klucz z listy kluczy.
  3. Uzyskaj wartość za pomocą n-tego klucza z tablicy danych.

Z array_values()potrzebujesz tylko 2.

  1. Uzyskaj wartości z tablicy danych.
  2. Uzyskaj n-tą wartość z listy wartości.

Z drugiej jednak strony, klucze są zwykle mniejsze, a dane mogą być bardzo zagnieżdżone, więc w równowadze, używając array_keys() jest prawdopodobnie bezpieczniejsze.


14
2017-07-01 11:29





Inną możliwością jest konwersja do zwykłej tablicy:

$ arraybuff = implode ("~~~", $ my_arr);
  $ my_arr = explode ("~~~", $ arraybuff);

Gdzie "~~~" jest ogranicznikiem, który nie pojawi się w twoich danych.

Teraz możesz uzyskać dostęp do tablicy za pomocą indeksów numerycznych równych przesunięciom.

Jeśli nadal potrzebujesz zachować tablicę asocjacyjną, po prostu przypisz ją do innej zmiennej.


1
2018-01-16 20:46





Spróbuj tego. Działa dla ciebie.

$result= array_values($my_arr); // Array with indexes you need

1
2017-12-23 07:24



Zachowaj ostrożność podczas publikowania w starym wątku, który ma już kilka odpowiedzi i zaakceptowaną odpowiedź. Musisz wyjaśnić, dlaczego twoja nowa odpowiedź jest lepsza niż te istniejące. - APC
k dziękuję. @ APC - Murali krishna


Jeśli macierz jest duża, obie array_keys i array_values będzie marnotrawstwem, ponieważ przydzieli nową tablicę o tym samym rozmiarze co oryginał, tylko po to, aby uzyskać nth klucz (lub wartość).

array_slice akceptuje przesunięcie całkowite i działa na tablicach asocjacyjnych. Możesz go użyć, aby uzyskać (i ustawić) nth 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;

1
2017-10-03 12:40