2010-10-30 8 views
1

Je vais essayer de vous expliquer le mieux possible.Obtenir la meilleure valeur de tableau en fonction d'une liste de priorités

je un tableau appelé $linkSets, et il a entires tableau qui ressemblent à:

<string>,<integer> 
<string>,<integer> 
<string>,<integer> 

J'ai aussi une liste de priorités, qui va dans cet ordre: 22 -> 18 -> 35 -> 34. Je voudrais vérifier chaque entier dans le tableau $linkSets, et obtenir le meilleur <string> de la même entrée de tableau basé sur le <integer>.

j'ai écrit le code qui ressemble à ceci:

foreach($linkSets as $link) 
{ 
    $parts = explode(',', $link); 
    if($parts[1] == 22) { 
     $best = $parts[0]; 
     break; 
    } 
    if($parts[1] == 18) { 
     $best = $parts[0]; 
     break; 
    } 
    if($parts[1] == 35) { 
     $best = $parts[0]; 
     break; 
    } 
    if($parts[1] == 34) { 
     $best = $parts[0]; 
     break; 
    } 
} 
echo "best: $best"; 

Mais comme vous pouvez le voir ne fonctionne pas, il ne respecte pas la liste des priorités.

Je ne peux pas penser à un moyen de le faire sans boucler à travers le tableau $linkSets plusieurs fois.

Répondre

2

Il y a des centaines de façons d'aborder ce problème, voici relativement simple:

$tmp = array(); 
foreach($linkSets as $link) 
{ 
    $parts = explode(',', $link); 
    $tmp[$parts[1]] = $parts[0]; 
} 

$priority = array(22, 18, 35, 34);  
$best = false; 

foreach($priority as $p) { 
    if(isset($tmp[$p])) { 
     $best = $tmp[$p]; 
     break; 
    } 
} 

echo "best: $best"; 

Ou encore plus simple, mais un peu hackier:

$tmp = array(22 => false, 18 => false, 35 => false, 34 => false); 
foreach($linkSets as $link) { 
    $parts = explode(',', $link); 
    $tmp[$parts[1]] = $parts[0]; 
}  
$best = current(array_filter($tmp)); // Works if your strings are non-false 
echo $best; 

Exemple de travail:

http://codepad.org/V6tHJAF7

+0

Parfait, merci. :) – Wen