Dans la programmation PHP, la fonction CEIL () est souvent utilisée pour rassembler les nombres de points flottants et renvoyer la valeur entière minimale pas moins que la valeur donnée. À première vue, il semble raisonnable d'utiliser le résultat de ceil () comme un indice de tableau - car il garantit de retourner un entier, mais en fait, cette pratique peut parfois entraîner des problèmes inattendus. Cet article explorera en profondeur pourquoi il peut être faux d'utiliser les résultats de ceil () directement comme indice de tableau et de fournir des solutions correspondantes.
Bien que la signification mathématique de la fonction CEIL () soit de rassembler, en PHP, son type de valeur de retour est un flotteur , pas un entier. Pour donner un exemple simple:
<?php
$val = 3.1;
$index = ceil($val);
var_dump($index); // float(4)
var_dump(gettype($index)); // string(5) "double"
?>
Notez que l'index renvoyé est le point flottant 4.0 , pas entier 4 .
Lorsque vous utilisez des nombres à virgule flottante comme clés d'un tableau, PHP convertira automatiquement les nombres à virgule flottante en entiers, mais cette conversion peut parfois apporter des problèmes inattendus.
<?php
$array = [];
$array[ceil(1.2)] = 'a';
$array[4.0] = 'b';
var_dump($array);
?>
Résultat de sortie:
array(2) {
[2]=>
string(1) "a"
[4]=>
string(1) "b"
}
Cela semble correct, mais si l'indice contient des numéros de points flottants à proximité des entiers comme 1.99999999999999999 , il peut provoquer une confusion d'index ou un écrasement.
Il y a un problème d'erreur de précision dans les calculs de points flottants, ce qui conduit à un numéro de point flottant qui est très proche d'un entier même si le résultat de ceil () est théoriquement une valeur entière, ce qui entraîne davantage la confusion dans l'indexation du tableau:
<?php
$value = 2.9999999999999996;
$index = ceil($value); // En théorie, c'est3
var_dump($index); // peut être float(3) Mais les performances internes sont incohérentes
$array = [];
$array[$index] = 'value1';
$array[3] = 'value2';
var_dump($array);
?>
Parfois, $ array [$ index] et $ array [3] sont considérés comme des clés différentes, provoquant une confusion de données.
Le moyen le plus sûr est de convertir explicitement les nombres de points flottants en entiers lors de l'utilisation des résultats ceil () pour fabriquer des index de tableau pour garantir que les types de clés sont corrects et cohérents.
<?php
$val = 3.1;
$index = (int) ceil($val);
$array = [];
$array[$index] = 'value';
var_dump($array);
?>
Cela évite les effets secondaires possibles de la conversion implicite.
Supposons que vous ayez besoin d'obtenir un paramètre numérique à partir de l'URL et de le contourner comme index:
<?php
$url = 'http://m66.net/path?num=2.7';
parse_str(parse_url($url, PHP_URL_QUERY), $query);
$num = $query['num'];
$index = (int) ceil($num);
$array = [];
$array[$index] = 'some value';
print_r($array);
?>
ceil () renvoie un numéro de point flottant, pas un entier.
Les clés de tableau PHP sont automatiquement converties lors de l'utilisation des numéros de point flottante, mais il existe des dangers cachés d'erreur de précision.
L'utilisation des résultats de CEIL () directement en tant qu'index peut provoquer un écrasement des données ou une confusion d'index.
Il est recommandé d'utiliser explicitement la conversion (int) lors de l'utilisation des résultats ceil () comme indice de tableau pour garantir que le type d'index est un entier.
La compréhension correcte du type de retour de ceil () et des règles de traitement de PHP pour les clés de tableau peut éviter les dangers cachés potentiels dans le code et écrire des programmes plus robustes et fiables.