Czy w PHP można zrobić coś takiego? Jak zabrałbyś się do napisania funkcji? Oto przykład. Porządek jest najważniejszy.
$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';
I chciałbym zrobić coś takiego
$properOrderedArray = sortArrayByArray($customer, array('name', 'dob', 'address'));
Ponieważ na końcu używam foreach () i nie są one we właściwej kolejności (ponieważ dołączam wartości do ciągu, który musi być w odpowiedniej kolejności i nie znam z góry wszystkich kluczy tablicy / wartości).
Przejrzałem wewnętrzne funkcje tablicowe PHP, ale wydaje się, że możesz sortować tylko alfabetycznie lub numerycznie.
Proszę bardzo:
źródło
array_merge()
!usort()
lubuasort()
?break
znalezieniu wartości należy wstawić instrukcję.array_merge()
tablicy+
. Łączy według klucza (również dla klawiszy numerycznych) i od lewej do prawej , podczas gdyarray_merge
łączy się od prawej do lewej i nigdy nie zastępuje klawiszy numerycznych. Np[0,1,2]+[0,5,6,7] = [0,1,2,7]
podczasarray_merge([0,1,2],[0,5,6,7]) = [0,1,2,0,5,6,7]
i['a' => 5] + ['a' => 7] = ['a' => 5]
alearray_merge(['a' => 5], ['a' => 7]) = ['a' => 7]
.+
znaku jest bezpieczne ?A co z tym rozwiązaniem
źródło
O(n * log n)
, to ten algorytm działaO(n^2 * log(n))
.Inny sposób dla PHP> = 5.3.0:
Wynik:
Działa dobrze z klawiszami ciągowymi i numerycznymi.
źródło
array_replace()
się , że lepiej przekazują zamiary niżarray_merge()
.array_replace
również pozostawia nienaruszony typ zmiennej. Jeśli jedna z wartości w twojej tablicy byłaby(string) '1'
i+
(int) 1
array_merge()
czy wystarczy je dołączyć?). Logika jest bardzo dobrze wyjaśnione tutaj . Po pierwsze ,array_flip()
zmienia wartości w $ order tablicę do kluczy. Po drugie ,array_replace()
zastępuje wartości z pierwszej tablicy wartościami z tymi samymi kluczami w drugiej tablicy. Jeśli chcesz posortować tablicę według kluczy z innej tablicy, nie musisz jej nawet używaćarray_flip
.źródło
Wybierz jedną tablicę jako zamówienie:
Możesz posortować inną tablicę na podstawie wartości za pomocą
array_intersect
Dokumentów :Lub w Twoim przypadku, aby posortować według kluczy, użyj
array_intersect_key
Dokumentów :Obie funkcje zachowają kolejność pierwszego parametru i zwrócą tylko wartości (lub klucze) z drugiej tablicy.
Tak więc w tych dwóch standardowych przypadkach nie musisz samodzielnie pisać funkcji, aby wykonać sortowanie / zmianę kolejności.
źródło
Użyłem rozwiązania Darkwaltz4, ale
array_fill_keys
zamiast tego użyłemarray_flip
, aby wypełnić,NULL
jeśli klucz nie jest ustawiony$array
.źródło
Bez magii ...
źródło
$dataset
nazwę parametruJEŚLI masz tablicę w swojej tablicy, będziesz musiał trochę dostosować funkcję przez Erana ...
źródło
Ta funkcja zwraca podrzędną i posortowaną tablicę na podstawie kluczy $ drugiego parametru
Przykład:
źródło
PHP ma funkcje, które pomogą Ci w tym:
Usort wykonuje całą pracę za Ciebie, a array_search dostarcza klucze. array_search () zwraca false, gdy nie może znaleźć dopasowania, więc elementy, które nie znajdują się w tablicy sortowania, naturalnie przesuwają się na dół tablicy.
Uwaga: uasort () uporządkuje tablicę bez wpływu na relacje klucz => wartość.
źródło
Kod:
źródło
Pierwsza sugestia
Druga sugestia
Chciałem zaznaczyć, że obie te sugestie są niesamowite. Są to jednak jabłka i pomarańcze. Różnica? Jeden jest przyjazny dla asocjacji, a drugi jest przyjazny dla skojarzeń. Jeśli używasz 2 w pełni asocjacyjnych tablic, wówczas scalanie / odwracanie szyku w rzeczywistości scali i nadpisze inną tablicę asocjacyjną. W moim przypadku to nie są wyniki, których szukałem. Użyłem pliku settings.ini do utworzenia tablicy porządku sortowania. Tablica danych, którą sortowałem, nie musiała zostać nadpisana przez mojego odpowiednika do sortowania asocjacyjnego. Zatem scalenie tablic zniszczyłoby moją tablicę danych. Obie są świetnymi metodami, obie muszą być zarchiwizowane w dowolnym zestawie narzędzi programistów. W zależności od potrzeb może się okazać, że w swoich archiwach faktycznie potrzebujesz obu koncepcji.
źródło
Przyjąłem odpowiedź z @ Darkwaltz4 ze względu na jej zwięzłość i chciałbym podzielić się, w jaki sposób dostosowałem rozwiązanie do sytuacji, w których tablica może zawierać różne klucze dla każdej iteracji, na przykład:
i utrzymywał „klucz główny” w następujący sposób:
array_merge wykonałby scalanie w iteracji Array [1] w oparciu o $ master_key i wyprodukował ['some_key'] = '', pustą wartość dla tej iteracji. Dlatego też array_intersect_key został użyty do zmodyfikowania $ master_key w każdej iteracji, tak jak poniżej:
źródło
Trochę późno, ale nie mogłem znaleźć sposobu, w jaki go zaimplementowałem, ta wersja wymaga zamknięcia, php> = 5.3, ale można ją zmienić, aby:
Oczywiście „dontSortMe” wymaga uporządkowania i może pojawić się jako pierwsze w przykładzie
źródło