Domanda

Ho fatto guardare usort, ma sono ancora un po 'confuso ...

Ecco ciò che l'oggetto $ myObject appare come:

Array
(
    [0] => stdClass Object
        (
            [tid] => 13
            [vid] => 4
        )

    [1] => stdClass Object
        (
            [tid] => 10
            [vid] => 4
        )

    [2] => stdClass Object
        (
            [tid] => 34
            [vid] => 4
        )

    [3] => stdClass Object
        (
            [tid] => 9
            [vid] => 4
        )

ho visto questo:

function cmp( $a, $b )
{ 
  if(  $a->weight ==  $b->weight ){ return 0 ; } 
  return ($a->weight < $b->weight) ? -1 : 1;
} 
usort($myobject,'cmp');

Sto cercando di risolvere in base alle tid, ma, credo che io non sono solo sicuro che davvero se devo cambiare il peso di qualcosa? O sarà solo di lavoro come è? Ho provato, ma niente in uscita ...

È stato utile?

Soluzione

cmp è la callback funzione che usort usa per confrontare gli oggetti complessi (come la tua) per capire come ordinare loro. modificare cmp per l'uso (o rinominarlo in quello che vuoi)

function cmp( $a, $b )
{ 
  if(  $a->tid ==  $b->tid ){ return 0 ; } 
  return ($a->tid < $b->tid) ? -1 : 1;
} 
usort($myobject,'cmp');

function sort_by_tid( $a, $b )
{ 
  if(  $a->tid ==  $b->tid ){ return 0 ; } 
  return ($a->tid < $b->tid) ? -1 : 1;
} 
usort($myobject,'sort_by_tid');

http://www.php.net/usort

Altri suggerimenti

Ho cercato di scrivere una funzione di confronto, per tre ore. E 'molto facile, infatti, ma ho pensato che mi mancava qualcosa e scrisse di nuovo e di nuovo da zero algoritmo che cambia in molti modi il test con il mio allineamento del campione.

Alla fine mi sono reso conto che il problema è in funzione uasort interna. E non finisce il confronto con tutti gli elementi. Non ricordo il nome di algoritmo usato in questo momento, ma io uso una versione migliorata (OW mio) in C ++. L'algoritmo utilizza un albero binario come metodo di confronto dividendo la matrice in tante coppie, come richiesto in una chiamata ricorsiva alla funzione di ordinamento con nuovi indici (limiti superiori, inferiori) ogni volta.

Quando la fetta rimanente è di un articolo, quindi indici superiori ed inferiori sono uguali e funzione pensa che ha terminato (gestito tutti gli elementi) anche se l'ultimo elemento non è stato valutato. Ordinamento funzioni utilizzando tale algoritmo sicuro quando il blocco più-interno ha un numero dispari. Funziona bene 2, lavoro 4, 8 .... elementi, ma non posso con 3, 5, 7, ecc ... L'esatta condizione di guasto dipende dagli elementi di ordinamento. I numeri possono non essere sempre significativo.

Ho risolto il problema anni fa. Non posso risolverlo da solo per PHP ora, perché non ho un compilatore PHP e non ho il codice sorgente PHP sia. Ma se qualcuno dal team di sviluppo di PHP mi contatta, mi può fornire la copia di lavoro di tale algoritmo in C ++. Lo stesso algoritmo è il modo più veloce di accedere agli elementi ordinati.

Per ottenere la proprietà stdClass operatore uso Object -> { 'name_property'}, ad esempio $ a -> { 'tid'}

function cmp( $a, $b )
{ 
  if(  $a->{'tid'} ==  $b->{'tid'} ){ return 0 ; } 
  return ($a->{'tid'} < $b->{'tid'}) ? -1 : 1;
} 
usort($myobject,'cmp');

function sort_by_tid( $a, $b )
{ 
  if(  $a->{'tid'} ==  $b->{'tid'} ){ return 0 ; } 
  return ($a->{'tid'} < $b->{'tid'}) ? -1 : 1;
} 
usort($myobject,'sort_by_tid');
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top