2010-05-28 6 views
3

J'utilise une classe qui me renvoie la valeur d'une ligne et d'une cellule particulières d'une feuille de calcul Excel. Pour construire un tableau d'une colonne, je compte les lignes et boucler ensuite ce nombre avec une boucle for() puis en utilisant $array[] = $value pour définir la valeur de l'objet tableau incrémentant.PHP: Vérifiez si 0?

Cela fonctionne très bien si aucune des valeurs d'une cellule n'est 0. La classe me renvoie un nombre 0 donc ça n'a rien à voir avec la classe, je pense que c'est la façon dont je suis en train de boucler les lignes et ensuite de les assigner au tableau ... Je veux passer à la valeur 0 parce que je crée des graphes avec les données après, voici le code que j'ai.

// Get Rainfall 
$rainfall = array(); 
for($i=1;$i<=$count;$i++) 
{ 
    if($data->val($i,2) != 'Rainfall') // Check if not the column title 
    { 
     $rainfall[] = $data->val($i,2); 
    } 
} 

Pour info $data est l'objet feuille de calcul Excel et la méthode $data->val(row,col) est ce qui me renvoie la valeur. Dans ce cas, j'obtiens des données de la colonne 2.

Screenshot of spreadsheet

+2

Essayez d'utiliser var_dump() et print_r() sur votre tableau de données. Ces fonctions astucieuses sont très utiles pour le débogage! –

+0

Que se passe-t-il lorsqu'un 0 est trouvé? – Tommy

+0

@John Je l'ai fait, c'est pourquoi je suis confus. J'ai 30 lignes dans le fichier Excel et quand je fais un print_r sur le tableau, je reçois seulement les valeurs qui ne sont pas 0 .. donc c'est comme si elle ignore 0 – tarnfeld

Répondre

4

Avez-vous essayé un array_push()?

array_push($rainfall, $data->val($i,2)); 
+0

YYESS !!! MERCI YOOO! – tarnfeld

+1

Je suis vraiment surpris ici. array_push() fonctionne mais $ array [] = $ var; ne fait pas? En fait, array_push() pour une seule variable n'est rien d'autre que $ array [] = $ var; J'ai pensé? – Max

3

Je voudrais utiliser une comparaison stricte avec l'opérateur not identical ici au lieu d'utiliser Égaux non opérateur:

if($data->val($i,2) !== 'Rainfall') 

Si $data->val($i,2) est un entier et que vous utilisez == les deux parties seront transtypage en entiers qui vous donnerait le résultat que tous les entiers fonctionneraient comme prévu, sauf pour zéro. Voici un résumé de la différence entre == et === lorsque l'on compare la chaîne « RainFall » avec zéro:

0 == "RainFall" : true 
0 != "RainFall" : false 
0 === "RainFall" : false 
0 !== "RainFall" : true 
+0

Est-ce que PHP ne va pas goofy avec des 0 et des comparaisons, ce qui signifie qu'il considère un 0 comme faux au lieu d'un entier dans certaines situations? Je pense que j'ai déjà vu ça quelque part ... – Tommy

+0

Oui. Mais c'est documenté: http://www.php.net/manual/en/types.comparisons.php – Arkh

1

Je pense que le tableau traite le 0 comme false, ce qui pourrait expliquer qu'il ne passe pas dans le tableau. Quelque chose comme ça fonctionnerait (si vous utilisez des entiers)?

(int)($data->val($i,2)); 

ou

(float)($data->val($i,2);) 
0

Le problème réside dans l'instruction if. Vous essayez de comparer une chaîne avec un entier, ce qui, selon la documentation de PHP, va convertir les entiers en entiers. Si vous comparez un nombre avec une chaîne ou si la comparaison implique des chaînes numériques, chaque chaîne est convertie en un nombre et la comparaison est effectuée numériquement. Ces règles s'appliquent également à l'instruction switch. La conversion de type n'a pas lieu lorsque la comparaison est === ou! == car cela implique de comparer le type ainsi que la valeur. Vous pouvez lire plus ici http://php.net/manual/en/language.operators.comparison.php.

Mise à jour: L'instruction if ne fonctionnera pas dans le cas de 0 parce (int)"Rainfall" volonté par typecasted en 0 par PHP faisant la déclaration soit if (0 != 0) { ... }.

Si $i représente le numéro de ligne, pourquoi ne pas partir de 2 au lieu de 1?