Mam następującą tablicę, którą chciałbym ponownie zindeksować, aby klucze były odwrócone (najlepiej zaczynając od 1):
Bieżąca tablica ( edytuj: tablica faktycznie wygląda tak):
Array (
[2] => Object
(
[title] => Section
[linked] => 1
)
[1] => Object
(
[title] => Sub-Section
[linked] => 1
)
[0] => Object
(
[title] => Sub-Sub-Section
[linked] =>
)
)
Jak powinno być:
Array (
[1] => Object
(
[title] => Section
[linked] => 1
)
[2] => Object
(
[title] => Sub-Section
[linked] => 1
)
[3] => Object
(
[title] => Sub-Sub-Section
[linked] =>
)
)
Odpowiedzi:
Jeśli chcesz ponownie indeksować zaczynając od zera, po prostu wykonaj następujące czynności:
Jeśli potrzebujesz go, aby zacząć od pierwszego, użyj następujących:
Oto strony podręcznika dotyczące używanych funkcji:
array_values()
array_combine()
range()
źródło
array_values
zwraca kopię tablicy. Więc jeśli masz odniesienia do tablicy,array_splice
byłoby lepiej. Zobacz rozwiązanie @imagiro.array_values()
by działało tylko wtedy, gdy cały czas zaczynasz od indeksu 0.Oto najlepszy sposób :
to wraca
robiąc to
masz to
Wyjaśnienie
array_values()
: Zwraca wartości tablicy wejściowej i indeksuje liczbowo.array_filter()
: Filtruje elementy tablicy za pomocą funkcji zdefiniowanej przez użytkownika (UDF Jeśli żadna nie zostanie podana , wszystkie wpisy w tabeli wejściowej o wartości FALSE zostaną usunięte ).źródło
array_filter()
wydaje się zupełnie nieistotne dla przykładowych danych.Właśnie się dowiedziałem, że możesz też zrobić
To powoduje ponowne indeksowanie w miejscu, więc nie otrzymasz kopii oryginalnej tablicy.
źródło
Po co reindeksować? Po prostu dodaj 1 do indeksu:
Edytuj Po wyjaśnieniu pytania: Możesz użyć
array_values
do zresetowania indeksu, zaczynając od 0. Następnie możesz użyć powyższego algorytmu, jeśli chcesz, aby wydrukowane elementy zaczynały się od 1.źródło
Cóż, chciałbym pomyśleć, że bez względu na cel końcowy nie musiałbyś modyfikować tablicy tak, aby była oparta na 1, a nie na 0, ale zamiast tego mógłbyś sobie z tym poradzić w czasie iteracji, jak opublikował Gumbo.
Jednak aby odpowiedzieć na twoje pytanie, ta funkcja powinna przekonwertować dowolną tablicę na wersję opartą na 1
EDYTOWAĆ
Oto bardziej elastyczna / wielokrotnego użytku funkcja, jeśli sobie tego życzysz
źródło
To zrobi, co chcesz:
źródło
Możesz rozważyć, dlaczego w ogóle chcesz używać tablicy opartej na 1. Tablice oparte na zerach (w przypadku korzystania z tablic niezasocjacyjnych) są dość standardowe, a jeśli chcesz wyświetlać dane wyjściowe do interfejsu użytkownika, większość z nich poradzi sobie z rozwiązaniem, po prostu zwiększając liczbę całkowitą po wyjściu do interfejsu użytkownika.
Pomyśl o spójności - zarówno w aplikacji, jak iw kodzie, z którym pracujesz - myśląc o indeksatorach opartych na 1 dla tablic.
źródło
Bardziej eleganckie rozwiązanie:
źródło
Możesz ponownie zindeksować tablicę, aby nowa tablica zaczynała się od indeksu równego 1 w ten sposób;
Wynik z powyższego to;
źródło
array_values
tutaj używać . Zobacz moją odpowiedź.Podobnie jak @monowerker, musiałem ponownie zindeksować tablicę za pomocą klucza obiektu ...
Spowodowało to:
źródło
źródło
Jeśli nie próbujesz zmienić kolejności tablicy, możesz po prostu zrobić:
$ tablica = tablica_reverse ($ tablica);
$ tablica = tablica_reverse ($ tablica);
Funkcja array_reverse jest bardzo szybka i zmienia kolejność podczas odwracania. Ktoś inny pokazał mi to dawno temu. Więc nie mogę przypisać sobie zasługi za wymyślenie tego. Ale to jest bardzo proste i szybkie.
źródło
Podobnie jak w przypadku wkładu Nicka, doszedłem do tego samego rozwiązania do ponownego indeksowania tablicy, ale ulepszyłem nieco tę funkcję, ponieważ od wersji PHP 5.4 nie działa z powodu przekazywania zmiennych przez odniesienie. Przykładowa funkcja reindeksowania wygląda więc tak, jak ta przy użyciu
use
zamknięcia słowa kluczowego:źródło
Oto moja własna realizacja. Klucze w tablicy wejściowej zostaną ponumerowane kluczami zwiększającymi się, zaczynając od $ start_index.
źródło
Po prostu zrób to:
źródło
Możesz to łatwo zrobić po połączeniu funkcji array_values () i array_filter (), aby usunąć puste elementy tablicy i ponownie zindeksować tablicę w PHP.
Funkcja array_filter () Funkcja PHP array_filter () usuwa puste elementy tablicy lub wartości z tablicy w PHP. Spowoduje to również usunięcie wartości pustych, null, false, 0 (zero).
Funkcja array_values () Funkcja PHP array_values () zwraca tablicę zawierającą wszystkie wartości tablicy. Zwrócona tablica będzie zawierała klucze numeryczne, zaczynając od 0 i zwiększając o 1.
Usuń puste elementy tablicy i ponownie zindeksuj
Najpierw zobaczmy wynik tablicy $ stack:
Wynik:
W powyższym wyjściu chcemy usunąć puste, null, 0 (zero) wartości, a następnie ponownie zindeksować elementy tablicy. Teraz użyjemy funkcji array_values () i array_filter (), jak w poniższym przykładzie:
Wynik:
źródło
array_filter()
wydaje się zupełnie nieistotny dla przykładowych danych PO.Zduplikowane usunięcie i ponowne zindeksowanie tablicy:
źródło
array_filter()
wydaje się zupełnie nieistotny dla przykładowych danych PO.Najszybszy sposób, jaki przychodzi mi do głowy
A jeśli chcesz tylko ponownie zindeksować tablicę (zacznij od zera) i masz PHP +7.3, możesz to zrobić w ten sposób
Uważam, że
array_unshift
jest lepszy niżarray_values
ten, który nie tworzy kopii tablicy.źródło
Wydaje się, że wszystkie
array_combine()
odpowiedzi kopiują ten sam „błąd” (niepotrzebne wezwaniearray_values()
).array_combine()
ignoruje klucze obu parametrów, które otrzymuje.Kod: ( Demo )
Wynik:
źródło
Sortowanie to po prostu sort () , ponowne zindeksowanie wydaje się trochę głupie, ale jeśli zajdzie taka potrzeba, wystarczy. Chociaż nie na miejscu. Użyj funkcji array_walk (), jeśli będziesz to robić w kilku miejscach, po prostu użyj pętli for-klucz-wartość, jeśli jest to operacja jednorazowa.
źródło
Jeśli można utworzyć nową tablicę, to jest to:
Jeśli potrzebujesz odwrócenia w miejscu, musisz działać wstecz, aby nie tupać na indeksach, których potrzebujesz:
źródło
array_values()
do uzyskania tablicy opartej na 0, a następnie dokonanie pewnych korekt tego wyniku, jeśli tablica oparta na 1 jest naprawdę wymagana.