[PHP] Sortowanie tablicy wg. jednej z wielu kolumn

0

Jak posortować tablicę:

==================
| a | b | c | d | e | f | g | h | <- nazwy kolumn tablicy $tab

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <- wartości rekordów
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

według kolumny np. g.
Próbowałem z sort($tab['g']) ale wtedy sortuje mi tylko tą kolumnę, a ja chcę żeby wraz z kolumną g sortowało analogicznie wszystkie kolumny.

0

Jeżeli możesz wytłumaczyć mi jak krowie na rowie składnie multisort na powyższym przykładzie tablicy, będę wdzięczny.

0

Czy tak ciężko przeczytać? Tam jest wszystko napisane i to po POLSKU ;)

array_multisort($tab['a'], $tab['b'], $tab['c'], $tab['d'], $tab['e'], $tab['f'], $tab['g'], $tab['h']);

Gdzie pierwszą w kolejności sortowaną kolumną będzie 'a', później 'b' itd. Więc jeśli chcesz posortować wg. kolumny 'c', to piszesz ją na pierwszym miejscu.

0
jagi napisał(a)

Czy tak ciężko przeczytać? Tam jest wszystko napisane i to po POLSKU ;)

array_multisort($tab['a'], $tab['b'], $tab['c'], $tab['d'], $tab['e'], $tab['f'], $tab['g'], $tab['h']);

Gdzie pierwszą w kolejności sortowaną kolumną będzie 'a', później 'b' itd. Więc jeśli chcesz posortować wg. kolumny 'c', to piszesz ją na pierwszym miejscu.

Chyba mnie nie zrozumiałeś, multisort działa w taki sposób że jeżeli napotka w pierwszej tablicy dwie takie same wartości to sortuje wg. następnej tablicy wejściowej. Co u mnie rujnuje tablice, ja potrzebuje posortowac tablicę wg. kolumny np. G bezwarunkowo.

0

W takiej sytuacji musisz przygotować sobie specjalną tablicę pod sortowanie. Nie testowałem kodu bo piszę z głowy ale chodzi o samą zasadę:

$kolumnaSortowana = &$tab['c'];
$rozmiarTablicy = count($kolumnaSortowana);

$nowaTablica = array();
for($i = 0; $i < $rozmiarTablicy; $i++) {
    $nowaTablica[i] = array($tab['a'][$i], $tab['b'][$i], $tab['d'][$i], $tab['e'][$i], ...);
    // Po tej operacji będziesz miał tablice w postaci:
    // 0 => a[0], b[0], d[0], e[0]
    // 1 => a[1], b[1], d[1], e[1]
    // ...
    // n => a[n], b[n], d[n], e[n]
}

array_multisort($kolumnaSortowana, $nowaTablica);

Może nie jest to najbardziej eleganckie rozwiązanie ale powinno działać. Zapewne da się w niektórych miejscach usprawnić obsługę. Ale pisałem to na szybko.

0

wystarczy "po ludzku" pomyśleć co chcesz naprawdę zrobić
czyli chcesz posortować w pierwszej kolejności w/g jednej kolumny a w drugiej kolejności w/g indeksu czyli mówiąc kodem

array_multisort($tab['a'], array_keys($tab));
0

oczywiście dalej po przecinku pozostałe kolumny ...

0
gfdgdf napisał(a)

wystarczy "po ludzku" pomyśleć co chcesz naprawdę zrobić
czyli chcesz posortować w pierwszej kolejności w/g jednej kolumny a w drugiej kolejności w/g indeksu czyli mówiąc kodem

array_multisort($tab['a'], array_keys($tab));

To rozwiązanie jest bezsensu i przede wszystkim nie da się wykonać przy nie równej ilość kolumn i rzędów.
Zrób tak jak pisałem a będzie dobrze.

0

bo powinno być array_keys($tab['a']) oczywiście
już nie chciałem pisać trzeciego posta pod sobą bo myślę że autor ma większe iq trochę i się sam domyśli
ale wiedziałem że się przyczepisz bo zapewne dwie nocki zarwałeś żeby dojść do tego swojego śmiesznego rozwiązania xD

0
fsdfdsf napisał(a)

bo powinno być array_keys($tab['a']) oczywiście
już nie chciałem pisać trzeciego posta pod sobą bo myślę że autor ma większe iq trochę i się sam domyśli
ale wiedziałem że się przyczepisz bo zapewne dwie nocki zarwałeś żeby dojść do tego swojego śmiesznego rozwiązania xD

Śmieszny jesteś gościu... Ale nie chce mi się nawet toczyć tak płytkiej konwersacji. Widać, uważasz, że pozjadałeś wszelkie rozumy. Jak chcesz się licytować i wywyższać to chyba to forum nie jest dobrym miejscem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1