Mam tablicę asocjacyjną w postaci, w key => value
której klucz jest wartością liczbową, jednak nie jest to kolejna wartość liczbowa. Klucz jest w rzeczywistości numerem identyfikacyjnym, a wartość jest liczbą. W większości przypadków jest to w porządku, jednak potrzebuję funkcji, która pobiera czytelną dla człowieka nazwę tablicy i używa jej dla klucza, bez zmiany wartości.
Nie widziałem funkcji, która to robi, ale zakładam, że muszę podać stary klucz i nowy klucz (oba mam) i przekształcić tablicę. Czy istnieje skuteczny sposób na zrobienie tego?
php
arrays
associative-array
Thomas Owens
źródło
źródło
Odpowiedzi:
źródło
Aby to zrobić i zachować porządek w tablicy, należy umieścić klucze tablicy w osobnej tablicy, znaleźć i wymienić klucz w tej tablicy, a następnie połączyć go z wartościami.
Oto funkcja, która właśnie to robi:
źródło
jeśli twoja
array
jest zbudowana z zapytania do bazy danych, możesz zmienić klucz bezpośrednio zmysql
instrukcji:zamiast
użyj czegoś takiego jak:
źródło
Odpowiedź z KernelM jest miła, ale aby uniknąć problemu podniesionego przez Grega w komentarzu (konflikt kluczy), użycie nowej tablicy byłoby bezpieczniejsze
źródło
Możesz użyć drugiej tablicy asocjacyjnej, która mapuje czytelne dla ludzi nazwy na id. Zapewniłoby to również relację wiele do jednego. Następnie zrób coś takiego:
źródło
Jeśli chcesz, aby położenie nowego klucza tablicy było takie samo jak starego, możesz to zrobić:
źródło
Jeśli tablica jest rekurencyjna, możesz użyć tej funkcji: przetestuj te dane:
oto funkcja:
źródło
źródło
Lubię rozwiązanie KernelM, ale potrzebowałem czegoś, co poradziłoby sobie z potencjalnymi konfliktami kluczy (gdzie nowy klucz może pasować do istniejącego klucza). Oto, co wymyśliłem:
Następnie możesz przewijać tablicę w następujący sposób:
źródło
Oto funkcja pomocnika, aby to osiągnąć:
całkiem na podstawie odpowiedzi @KernelM .
Stosowanie:
Zwróci true po udanej zmianie nazwy, w przeciwnym razie false .
źródło
Proste rzeczy:
ta funkcja zaakceptuje docelowy skrót $, a $ zamienniki to również skrót zawierający powiązania newkey => oldkey .
Ta funkcja zachowuje pierwotną kolejność , ale może być problematyczna w przypadku bardzo dużych (jak powyżej 10 000 rekordów) tablic dotyczących wydajności i pamięci .
ta alternatywna funkcja zrobiłaby to samo, przy znacznie lepszej wydajności i zużyciu pamięci, kosztem utraty oryginalnego zamówienia (co nie powinno stanowić problemu, ponieważ jest hashtable!)
źródło
ten kod pomoże zmienić stary klucz na nowy
wyświetlać się jak
źródło
Proste porównanie wyników obu rozwiązań.
Rozwiązanie 1 Skopiuj i usuń (zamówienie utracone) https://stackoverflow.com/a/240676/1617857
Rozwiązanie 2 Zmień nazwę klucza https://stackoverflow.com/a/21299719/1617857
Wyniki:
źródło
Możesz użyć tej funkcji w oparciu o array_walk:
To daje:
źródło
działa to na zmianę nazwy pierwszego klucza:
następnie print_r ($ a) renderuje naprawioną tablicę w kolejności:
działa to na zmianę nazwy dowolnego klucza:
print_r ($ a)
uogólniona funkcja:
źródło
Jeśli chcesz wymienić kilka kluczy jednocześnie (zachowując porządek):
Stosowanie:
źródło
Istnieje alternatywny sposób zmiany klucza elementu tablicy podczas pracy z pełną tablicą - bez zmiany kolejności tablicy. Po prostu skopiuj tablicę do nowej tablicy.
Na przykład pracowałem z mieszaną, wielowymiarową tablicą, która zawierała indeksowane i asocjacyjne klucze - i chciałem zastąpić klucze liczb całkowitych ich wartościami, nie przerywając kolejności.
Zrobiłem to, zmieniając klucz / wartość dla wszystkich wpisów tablicy numerycznej - tutaj: ['0' => 'foo']. Pamiętaj, że zamówienie jest nienaruszone.
Wynik:
źródło
najlepszym sposobem jest użycie referencji, a nie użycie nieustawionych (co stanowi kolejny krok do wyczyszczenia pamięci)
rozwiązanie:
masz jeden oryginał i jedno odniesienie z nową nazwą.
lub jeśli nie chcesz, aby dwie nazwy w jednej wartości były dobre, zrób inną zakładkę i wypowiedz na wszelki wypadek
Iterracja jest lepsza dla kluczy niż klonowanie całej tablicy i czyszczenie starej tablicy, jeśli masz długie dane, takie jak 100 wierszy +++ itp.
źródło
Hmm, nie testuję wcześniej, ale myślę, że ten kod działa
źródło
Taki, który zamówienia preserverów są łatwe do zrozumienia:
źródło
Możesz napisać prostą funkcję, która stosuje wywołanie zwrotne do klawiszy danej tablicy. Podobne do array_map
Oto sedno https://gist.github.com/vardius/650367e15abfb58bcd72ca47eff096ca#file-array_map_keys-php .
źródło
Ta funkcja zmieni nazwę klucza tablicy, zachowując jego pozycję, łącząc się z wyszukiwaniem indeksów.
Stosowanie:
źródło
Ta podstawowa funkcja obsługuje zamianę klawiszy tablicy i utrzymanie tablicy w oryginalnej kolejności ...
Możesz następnie przejść przez pętlę i zamienić wszystkie klucze „a” na „z” na przykład ...
źródło