2011-05-28 2 views
1

Je ne comprends pas bien comment PHP alloue, donc je ne sais pas si j'ai fait une erreur, ou si c'est un bug.Utilise-t-on l'écrasement de la tête ou de la queue de la matrice?

usort() met à zéro par intermittence la tête ou la queue du réseau.

class foo 
{ 
    public $idx; 
    public $data; 
} 

function compare_foos ($a, $b) 
{ 
    if ($a->data == $b->data) 
    return 0; 
    elseif ($a->data < $b->data) 
    return -1; 
    else 
    return 1; 
} 

$mylist = Array(); 

for ($i=0; $i < 10; ++$i) 
{ 
    $mylist[$i] = new foo(); 
    $mylist[$i]->idx = $i; 
    $mylist[$i]->data = rand() % 20; 
} 

print_r ($mylist); 
usort ($mylist, compare_foos); 
echo "<HR>"; 
print_r ($mylist); 
+0

Exemple en direct: http://codepad.org/fOdA0hca. Que voulez-vous dire par * mettre à zéro la tête ou la queue *? Le tri semble fonctionner comme prévu. –

+1

Ce code fonctionne correctement. 'usort ($ mylist, compare_foos);' - quote 'compare_foos', c'est juste une chaîne, pas une constante. –

+0

C'est probablement un bug dans mon installation php alors. Parfois, il remplace le premier ou le dernier élément par un null (pas de données). Je ne connais pas le terme PHP spécifique pour cela. Cela fonctionne à chaque fois si je code moi-même la fonction de tri. Je me demandais juste si j'allouais correctement le tableau, c'est tout. Puisque vous dites que je suis, ça doit être un bug dans le système local. – gecko

Répondre

2

Callbacks, comme celui utilisé par usort, peut être spécifiée de 3 manières différentes:

  • une chaîne contenant le nom de la fonction:

    usort($mylist, 'compare_foos'); 
    
  • une réelle fonction:

    usort($mylist, create_function(/*...*/)); 
    // php >= 5.3 only: 
    usort($mylist, function ($a, $b) { 
        /* ... */ 
    }); 
    
  • un tableau pour accéder à des méthodes d'objet:

    usort($mylist, array($myobject, 'mymethod')); 
    

l'aide d'un rappel de la façon dont vous avez fait est pas valide et php renvoie une erreur:

PHP Notice: Use of undefined constant compare_foos - assumed 'compare_foos' in /home/lepidosteus/test.php on line 28 

Pour le voir, souvenez-vous de code avec toutes les erreurs activées sur votre machine de développement (mais cachées sur le serveur de production), en utilisant error_reporting():

error_reporting(E_ALL); // display all errors including notices 
error_reporting(0); // hide all errors 

Par ailleurs si vous souhaitez utiliser un objet comme un magasin simple, vous n'avez pas besoin de créer une classe dédiée, vous pouvez utiliser stdClass():

$mylist[$i] = new stdClass(); 
$mylist[$i]->idx = $i; 
$mylist[$i]->data = rand() % 20; 

, vous pouvez également utiliser var_dump() au lieu de print_r lorsque vous déboguer pour obtenir des informations détaillées sur le type de chaque variable, peut vous aider à trouver rapidement si quelque chose ne va pas.

+0

Merci, ceci est utile et m'apprend des choses que je ne connaissais pas. Je peux voir à partir de var_dump() qu'usort remplace en quelque sorte un élément du tableau par un élément non initialisé. [10] => objet (foo) # 10 (2) {["idx"] => NULL ["data"] => NULL}. Je vais le mettre à un bug php, ou un bug dans mon système php, et contourner ce problème. Peut-être sortir du sujet ici maintenant, mais existe-t-il une suite de tests pour vérifier la fonctionnalité d'un système php? – gecko

+0

Si je copie le code de votre question à l'intérieur d'un fichier (en corrigeant le problème de rappel et en ajoutant une balise d'ouverture php) et que je l'exécute une douzaine de fois, je ne peux jamais reproduire ce comportement. Avez-vous essayé cela vous-même? (SEULEMENT le code dans la question, pas une seule ligne de plus, même si vous pensez que cela ne l'affectera pas). C'est comme si votre problème venait d'ailleurs. – Lepidosteus

+0

Oui, le code devrait fonctionner. C'est pourquoi j'ai pensé à demander l'avis de spécialistes PHP. C'est bien sur un serveur PHP différent. Juste un peu de bizarrerie locale avec l'installation je suppose. Merci encore pour votre aide dans l'explication de diverses choses PHP. – gecko

Questions connexes