2012-03-23 16 views
5

Wygląda na to, że sortuję tablicę w odwrotnej kolejności i nie zachowuję kluczy. Na przykład, chciałbym tej tablicy:Naturalne sortowanie tablicy PHP w odwrotnej kolejności i nieprzechowywanie kluczy

[0] => 1-string 
[1] => 2-string 
[2] => 10-string 
[3] => 4-srting 
[4] => 3-srting 

skończyć jak ten:

[0] => 10-srting 
[1] => 4-string 
[2] => 3-string 
[3] => 2-string 
[4] => 1-string 

Mam to blisko z usort ($ array 'strnatcmp'); ale nie jest w odwrotnej kolejności. array_reverse() after nie pomaga.

Wszelkie pomysły?

+0

Czy to naturalne czy nienaturalne zamówienie? Myślałem, że naturalne było "liczenie", więc byłoby to "1-łańcuchowe, 10-łańcuchowe, 2-łańcuchowe, 3-łańcuchowe, 4-łańcuchowe" i nienaturalne byłyby "4-łańcuchowe, 3-łańcuchowe, 2-łańcuchowe, 10" -string, 1-string'. Jestem znany z tego, że źle rozumiem rzeczy (ponieważ jestem żonaty i nieporozumienia zdarzają się 24 godziny na dobę, 7 dni w tygodniu), więc możesz podać bardziej szczegółowe wyjaśnienie, ponieważ nie rozumiem twojego systemu zamawiania. – Michael

+0

Naturalny to 1, 2, 3, 4, 10 - co mogę zrobić. Teraz muszę to zrobić w odwrotnej kolejności, więc: 10, 4, 3, 2, 1. – Phil

Odpowiedz

4

Jestem trochę zdziwiony o "array_reverse() po nie pomaga." bo

<?php 
echo PHP_VERSION, "\n"; 

$x = array( 
    '1-string', 
    '2-string', 
    '10-string', 
    '4-srting', 
    '3-srting' 
); 

natsort($x); 
$x = array_reverse($x, false); 
print_r($x); 

wydruków

5.3.8 
Array 
(
    [0] => 10-string 
    [1] => 4-srting 
    [2] => 3-srting 
    [3] => 2-string 
    [4] => 1-string 
) 

na moim komputerze

+0

Teraz działa! Nie jestem pewien, co robiłem źle ... Dzięki. – Phil

0

Czy pasuje do Twoich potrzeb?

+0

Nie. To daje mi 4, 3, 2, 10, 1. – Phil

+0

nie, ponieważ traktuje je jako struny http://codepad.org/wb4cv8hO –

5

Użyj atrybutu $preserveKeys z array_reverse(), aby zresetować klucze, a także odwrócić tablicę po natcasesort().

function rnatcasesort(&$array) { 
    natcasesort($array); 
    $array = array_reverse($array, false); 
} 

$values = array('1-string', '2-string', '10-string', '4-string', '3-string'); 

rnatcasesort($values); 

var_dump($values); 

/* 
array(5) { 
    [0]=> 
    string(9) "10-string" 
    [1]=> 
    string(8) "4-string" 
    [2]=> 
    string(8) "3-string" 
    [3]=> 
    string(8) "2-string" 
    [4]=> 
    string(8) "1-string" 
} 
*/ 

0

Można zrobić

<?php 
$arr = array("1-string", "2-string", "10-string","4-srting", "3-srting"); 

function sort_reverse($a, $b){ 
    $a = (int)$a; 
    $b = (int)$b; 
    if ($a > $b){ 
    return -1; 
    } 
    if ($a < $b){ 
    return 1; 
    } 
    return 0; 
} 
usort($arr, "sort_reverse"); 
var_dump($arr); 

pad tutaj http://codepad.org/6dn81S3f

0

To działa:

$array = array('1-string', '2-string', '10-string', '4-string', '3-string'); 
natsort($array); 
$array = array_reverse($array); 
print_r($array); 
2

użytkowania rsort() z flagą SORT_NATURAL.

rsort($array, SORT_NATURAL); 

SORT_NATURAL został wprowadzony w PHP 5.4. Jeśli masz niższą wersję, przejdź do wersji array_reverse (natsort()).

Powiązane problemy