2009-01-27 11 views
0

J'écris un script en PHP qui compare les personnes en fonction du nombre de réponses identiques dans un sondage. J'utilise un tableau comme celui-ci:Problème de tableau PHP

[ID personne] =>nombre de réponses mêmes

pour stocker les 10 personnes les plus proches de celui que je suis Rivalisant avec.

J'ai besoin de savoir comment trouver le plus bas du 10 nombre de réponses mêmes et écraser un plus nombre de réponses mêmes et modifier l'ID personne clé avec elle.

Une aide?

+0

Pouvez-vous reformuler « le plus bas du nombre 10 de réponses mêmes et écrasera une plus nombre de réponses identiques et modifier la clé d'identification de personne avec elle. "? Je ne peux pas comprendre ce que vous demandez. Vous devriez déjà remarqué: l'anglais n'est pas mon idiome de choix. – Eineki

+0

Hmm. Je dois garder un tableau complet des 10 correspondances les plus élevées. Ce problème a été résolu selon la recommandation de Tim – user29772

Répondre

1

Ne serait-il pas plus simple de garder votre tableau trié par nombre de réponses identiques? Peut-être même juste ajouter la nouvelle personne, recourir à la matrice et supprimer le premier/dernier ..

+0

C'est toujours évident! – user29772

2

On dirait que vous pourriez résoudre cela en SQL très facilement, mais cela demandera beaucoup de travail en PHP.

1

Vous devez trier les entrées selon le delta à person.number_of_answers. Par exemple .:

function cmp_by_delta($a, $b) { 
    if ($a->delta == $b->delta) { 
    return 0; 
    } 
    return ($a->delta < $b->delta) ? -1 : 1; 
} 
// calculate delta for each entry 
foreach ($entries as $person) { 
    $person->delta = abs($target_person->number_of_answers - $person->number_of_answers); 
} 
// sort entries by delta 
usort($entries, 'cmp_by_delta'); 
// take 10 first matches from sorted array 
$10_best_matches = array_slice($entries, 0, 10); 

Bien sûr, cela peut être fait beaucoup plus joli et beaucoup plus efficace dans une base de données:

select * from people 
order by abs(number_of_answers - :target_number_of_answers) 
limit 10;