2013-04-10 18 views
5

Sto cercando come costruire un classificatore di array basato su un valore.classificatore php in base al valore

Ho un risultato della matrice come:

key => 0 | id => 16103 | Thumbs => 0 
key => 1 | id => 23019 | Thumbs => 0 
key => 2 | id => 49797 | Thumbs => 5 <- key 2 needs to switch with key 1 
key => 3 | id => 51297 | Thumbs => 0 
key => 4 | id => 58106 | Thumbs => 0 
key => 5 | id => 59927 | Thumbs => 4 <- will be stay at this position 
key => 6 | id => 61182 | Thumbs => 0 
key => 7 | id => 68592 | Thumbs => 0 
key => 8 | id => 70238 | Thumbs => 10 <- key 8 needs to switch with key 6 
key => 9 | id => 71815 | Thumbs => 0 
key => 10 | id => 78588 | Thumbs => 0 
etc.. 

desidero scrivere una funzione per riprodurre il risultato della matrice sopra come segue. Quando un record ha 5 pollici, è necessario spostare "uno" in alto nell'output, quando ha 10 pollici 2 in alto e così via.

Immagino che dovrei riprodurre l'array in un primo momento per impostare il tasto (prio) per ogni uscita come 100,200,300 in modo che abbiamo abbastanza spazio per impostare una riga tra?

Grazie in anticipo!

+0

Quindi volete il tasto 8 in alto, il tasto 2 in seconda posizione e poi ogni altro ingresso con 4 o meno? o il tasto 2 va solo al tasto 1 e il tasto 8 al tasto 6? – Chris

+0

Penso che dovresti fare un contatore (un campo in più) in cui memorizzi i "thumbs" temporanei e se raggiunge i cinque, ordina gli array con questo e poi lo azzeri, quindi non salirà due volte. – Voitcus

+0

@Chris questi risultati provengono da un'azione di ricerca in modo che abbiano già un certo peso. Non voglio buttare via tutto questo per dire che il risultato con la maggior parte dei pollici è il migliore. Voglio fare una sorta di combinazione tra l'algoritmo di ricerca e user_inputs ed è per questo che mi piacerebbe classificare "gentilmente" con i pollici (da input dell'utente) dati. 5 pollici significa una posizione più alta, 10 pollici 2 posizioni più alte ecc. – directory

risposta

1

Immagino che nel vostro esempio sia meglio usare una serie di array. (Se non lo hai già fatto, non è chiaro dalla domanda). Come così.

$array = array(); 
$array[0] = array('id'=>16103, 'Thumbs'=>0); 
$array[1] = array('id'=>16103, 'Thumbs'=>0); 
... 

Quindi, iniziare scrivendo una funzione di scambio.

function swap (&$arr,$key1,$key2) { 
    $temp=$arr[$key1]; 
    $arr[$key1]=$arr[$key2]; 
    $arr[$key2]=$temp; 
    // the & before the $arr parameter makes sure the array is passed as a reference. So no need to return the new array at the end. 
} 

Ora per la vostra funzione di rango:

function rank(&$arr) { 
    for ($i = 0; $i < count($arr); $i++) { 
     if ($arr[$i] < 5) continue; 
     $places_to_move = $arr[i]['Thumbs']/5; // get number of places to promote the entry 
     $places_to_move = max($places_to_move, $i); // make sure we don't move it out of the array bounds 
     swap($arr, $i, $i - $places_to_move); 
    } 
} 

Poi sufficiente chiamare la funzione rango per l'array non classificato

rank($array); 
+0

Perché downvote? Penso che questo sia un approccio migliore della mia risposta. – enrey

+0

Non mi restituirà risultati classificati, ma l'array attraverso la funzione fornisce lo stesso array:/La tua funzione sembra classificare i risultati ok ?! – directory

0

Quindi, se ho capito bene, si dispone di un array di array :

$array = array(
    array('key' => 0, 'id' => 16103, 'Thumbs' => 0), 
    array('key' => 1, 'id' => 23019, 'Thumbs' => 0), 
    array('key' => 2, 'id' => 49797, 'Thumbs' => 5), //<- key 2 needs to switch with key 1 
    array('key' => 3, 'id' => 51297, 'Thumbs' => 0), 
    array('key' => 4, 'id' => 58106, 'Thumbs' => 0), 
    array('key' => 5, 'id' => 59927, 'Thumbs' => 4), //<- will be stay at this position 
    array('key' => 6, 'id' => 61182, 'Thumbs' => 0), 
    array('key' => 7, 'id' => 68592, 'Thumbs' => 0), 
    array('key' => 8, 'id' => 70238, 'Thumbs' => 10), //<- key 8 needs to switch with key 6 
    array('key' => 9, 'id' => 71815, 'Thumbs' => 0), 
    array('key' => 10, 'id' => 78588, 'Thumbs' => 0) 
); 

In questo caso, è possibile utilizzare usort():

usort($array, function($a, $b){ 
    $a_thumbs_val = floor($a['Thumbs']/5); 
    $a_val = $a_thumbs_val ? $a['key'] - $a_thumbs_val - 0.5 : $a['key']; 

    $b_thumbs_val = floor($b['Thumbs']/5); 
    $b_val = $b_thumbs_val ? $b['key'] - $b_thumbs_val - 0.5 : $b['key']; 
    return ($a_val > $b_val) ? 1 : -1; 
}); 


var_dump($array); 

produrrebbe:

array (size=11) 
    0 => 
    array (size=3) 
     'key' => int 0 
     'id' => int 16103 
     'Thumbs' => int 0 
    1 => 
    array (size=3) 
     'key' => int 2 
     'id' => int 49797 
     'Thumbs' => int 5 
    2 => 
    array (size=3) 
     'key' => int 1 
     'id' => int 23019 
     'Thumbs' => int 0 
    3 => 
    array (size=3) 
     'key' => int 3 
     'id' => int 51297 
     'Thumbs' => int 0 
    4 => 
    array (size=3) 
     'key' => int 4 
     'id' => int 58106 
     'Thumbs' => int 0 
    5 => 
    array (size=3) 
     'key' => int 5 
     'id' => int 59927 
     'Thumbs' => int 4 
    6 => 
    array (size=3) 
     'key' => int 8 
     'id' => int 70238 
     'Thumbs' => int 10 
    7 => 
    array (size=3) 
     'key' => int 6 
     'id' => int 61182 
     'Thumbs' => int 0 
    8 => 
    array (size=3) 
     'key' => int 7 
     'id' => int 68592 
     'Thumbs' => int 0 
    9 => 
    array (size=3) 
     'key' => int 9 
     'id' => int 71815 
     'Thumbs' => int 0 
    10 => 
    array (size=3) 
     'key' => int 10 
     'id' => int 78588 
     'Thumbs' => int 0 

Nota: 2 voci che dovrebbero essere sulla stessa posizione potrebbe essere in entrambi i casi arround, dal momento che fa usort sorta instabile. Puoi andare in giro aumentando quella chiusura in usort, aggiungendo un paragone più complicato.

Problemi correlati