2010-09-28 17 views
1

J'ai un script PHP dans lequel je réarrange un tableau multidimensionnel en utilisant la fonction usort().Question sur la fonction PHP usort

c'est un tableau d'échantillons (print_r-sortie) de tableau $ arr

Array 
(
    [3] => Array 
     (
      [name] => Bjudningen 
      [grade] => 5 
      [grade_type] => calculated 
      [orgname] => LInvitation 
      [id] => 13975 
     ) 

    [0] => Array 
     (
      [name] => Coeur fidèle 
      [grade] => 3 
      [grade_type] => calculated 
      [orgname] => Coeur fidèle 
      [id] => 8075 
     ) 

    [2] => Array 
     (
      [name] => Dawsonpatrullen 
      [grade] => 5 
      [grade_type] => calculated 
      [orgname] => The Dawson Patrol 
      [id] => 13083 
     ) 

) 

Et voici mon script PHP

function sort_movies($arr,$val){ 
    function cmp($x, $y) 
    { 
    if ($x[$val] == $y[$val]) 
     return 0; 
    else if ($x[$val] < $y[$val]) 
     return -1; 
    else 
     return 1; 
    } 
    usort($arr, 'cmp'); 
    return $arr; 
} 

$sorted = sort_movies($arr,"grade"); 

Je veux être en mesure de trier le tableau sur les différents sous-clés (c'est-à-dire nom, grade, id), mais cela ne fonctionne pas comme je le fais ci-dessus. Toutefois, si je change $val dans la fonction de tri des films à la valeur "grade" cela fonctionne, donc pour une raison quelconque, il ne me permettra pas d'envoyer un vaiable comme paramètre de tri.

qu'est-ce que je fais mal?

Répondre

0

Vous pouvez essayer ceci en envoyant l'index de la sous-clé, c'est-à-dire la note au lieu du nom de la sous-clé.

0

Avec 5.3 vous pouvez le faire comme ceci:

function create_sort($key) 
{ 
    return function($x,$y) use($key) 
    { 
     return $x[$key] - $y[$key]; 
    }; 
} 
$sorter = create_sort('name'); 
usort($arr, $sorter); 
+0

mon serveur est seulement 5.2 malheureusement – Volmar

0

Le problème est que $ val est disponible dans le cadre de la fonction sort_movies(), pas dans le champ d'application de cmp(). Vous devez simplement le déclarer comme global. Cela va le mettre dans la portée de sorte que vous pouvez l'utiliser dans la fonction cmp().

function sort_movies($arr,$val){ 
    function cmp($x, $y) 
    { 
     global $val; // <--------------------------------- 
     if ($x[$val] == $y[$val]) 
      return 0; 
     else if ($x[$val] < $y[$val]) 
      return -1; 
     else 
      return 1; 
    } 
    usort($arr, 'cmp'); 
    return $arr; 
} 

$sorted = sort_movies($arr,"grade"); 

http://php.net/manual/en/language.variables.scope.php