2015-07-02 11 views
7

Jeśli mają raczej podstawowe uasort funkcji w PHP, który wygląda tak:klucz tablica dostęp za pomocą uasort w PHP

uasort($arr, function($a, $b) { 
       if ($a > $b) 
        return -1; 
       if ($a < $b) 
        return 1; 
... 
} 

Tablica Próbuję uporządkować wygląda następująco:

{[1642] => 1, [9314] => 4, [1634] => 3 ...} 

Zawiera liczby całkowite, które są moimi głównymi kryteriami porównywania. Jeśli jednak liczby całkowite są równe, chciałbym uzyskać dostęp do ich wartości klucza, wewnątrz funkcji uasort i zrobić trochę magii, aby dowiedzieć się, jak sortować stamtąd.

Nie mam pojęcia, jak to zrobić, ponieważ wydaje się, że zmienne $a i $b, które są przekazywane do funkcji, są po prostu liczbami całkowitymi bez odpowiednich klawiszy, ale powinien istnieć sposób dostępu do klucza również, ponieważ " m za pomocą funkcji, aby rzeczywiście zachować klucze. Jakieś pomysły?

+0

Co magia mówimy tutaj? Mogą być na to inne sposoby. – Andrew

+0

"Magia" lub logika aplikacji jest dość pomieszana, ponieważ wymaga specjalnych zapytań DB, jeśli liczby całkowite są równe. Na szczęście przez większość czasu nie są one dostępne i mogłem wymyślić obejście, na przykład, tworząc kolejną tablicę 2D, która zawiera liczby całkowite jako jedną wartość, a klucz jako inny następnie podaje ją do pakietu uasort. Mam jednak nadzieję, że jest lepszy i łatwiejszy sposób na zrobienie tego. – mmvsbg

Odpowiedz

10
uksort($arr, function ($a, $b) use ($arr) { 
    return $arr[$a] - $arr[$b] ?: $a - $b; 
}); 

można uzyskać wartości za pomocą klawiszy, więc używaj uksort który daje klucze. Wymień $a - $b z odpowiednią magią, tutaj po prostu sortuj według wartości klucza.

+0

Po prostu nie interesuje mnie: czy to jest moje środowisko PHP 5.3.1, czy też inni użytkownicy zauważają problemy z klauzulą ​​'use()'? – cars10m

+1

Działa również w moim środowisku, jeśli użyjesz 'use (& $ arr)' zamiast 'use ($ arr)'. Zawartość (tj. Kolejność) '$ arr' zmienia się w czasie i' use ($ arr) 'działałaby tylko z ** statyczną kopią **, patrz tutaj: http: //php.net/manual/de /functions.anonymous.php – cars10m

+0

Dziękuję, dokładnie to, czego potrzebowałem. I guest "uasort" jest po prostu niewłaściwą funkcją do użycia w tym przypadku. Używam PHP 5.4 i 5.5, więc nie ma problemów z "używaniem", wszystko działa po wyjęciu z pudełka. – mmvsbg

0

Dyrektywa use (w roztworze deceze za) nie działa w mojej starej instalacji PHP 5.3.1, a to przyniesie rezultat:

$arr=array('1642'=>1,'9314'=>2,'1634'=>1,'1633'=>5,'1636'=>7,'1610'=>1); 
print_r($arr); 

function mycmp($a, $b) { 
if ($a > $b) return -1; 
if ($a < $b) return 1; 
else return 0; 
} 
function mysrt($arr){ 
foreach ($arr as $k => $v) $new[$k]="$v $k"; 
uasort($new, 'mycmp'); $ret=array(); 
foreach ($new as $k => $v) $ret[$k]=$arr[$k]; 
return $ret; 
} 
print_r(mysrt($arr)); 

mysrt() nie sort „na miejscu”, ale powróci posortowana tablica. I oczywiście: moja "magia" przy sortowaniu kluczy jest raczej podstawowa. Klucze zostaną posortowane w taki sam sposób jak wartości. Modyfikując instrukcję $new[$k]="$v $k";, możesz zmienić zachowanie zgodnie ze swoimi potrzebami.

Na marginesie ...

deceze na rozwiązanie będzie praca na moim serwerze tylko wtedy, gdy używam use(&$arr) zamiast use($arr):

uksort($arr, function ($a, $b) use(&$arr) { 
    return $arr[$a] - $arr[$b] ? $arr[$a] - $arr[$b] : $a - $b; 
}); 
Powiązane problemy