[RESOLU] Problème de compteur

Eléphanteau du PHP | 29 Messages

22 juin 2016, 12:44

Bonjour à tous,

Je dispose d'un tableau avec 10 éléments (10 lignes hors entête) mais lorsque je fait un count() ou bien une boucle foreach cela me renvoi une valeur supérieur à la valeur attendu.

voici mon tableau:
Array (
[nom] => Array (
[0] => A [1] => D [2] => B [3] => E [4] => A [5] => D [6] => B [7] => E [8] => A [9] => D )
[a] => Array (
[0] => 3 [1] => 4 [2] => 6 [3] => 5 [4] => 3 [5] => 3 [6] => 6 [7] => 5 [8] => 4 [9] => 6 )
=> Array (
[0] => 5 [1] => 4 [2] => 5 [3] => 5 [4] => 3 [5] => 4 [6] => 5 [7] => 6 [8] => 4 [9] => 5 )
)
Voici mon code:
foreach ($array as $ligne => $column) {
       foreach ($column as $value) {
            $i++;
        }
}
echo $i;
echo count ($array);
Au lieu de me renvoyé 11 cela me renvoi 30 pour $i et 3 pour le count ($array) :?:
J
Il faudrait compter le nombre de ligne mais je ne vois pas comment m'y prendre.

Merci d'avance pour votre aide :)

Mammouth du PHP | 1967 Messages

22 juin 2016, 13:42

le plus simple serait de faire un count($array['nom']); pour autant que l'index est toujours 'nom' et que cette "colonne" est représentative.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 juin 2016, 14:42

Bonjour,

Ton problème vient du fait que tu incrémentes ta variable $i pour chaque élément de chacun de tes tableaux (2 foreach imbriqués) et que tu affiche le résultat à la fin, donc après avoir cumulé le nombre d'éléments de chacun de tes tableaux... Tu comptes donc les éléments de 3 tableaux contenant 10 éléments chacun, le résultat final est bien 30

La fonction count() te retourne le nombre d'élément du tableau spécifié, mais ne vérifie pas si les éléments sont eux même des tableaux..

Difficile de te donner une solution ne sachant pas ce que tu veux faire... tu peux essayer des trucs du genre :
foreach ($array as $ligne => $column) {
       $i = 0;
       foreach ($column as $value) {
            $i++;
        }
       echo $i . " <br />";
}
foreach ($array as $ligne => $column) {
       echo count($column) . " <br />";
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 29 Messages

23 juin 2016, 10:06

Je veux connaître le nombre de ligne de mon tableau afin de le parcourir et de récupérer par exemple les valeurs comprises entre les 10% des premières valeurs et 30% des dernières et de les ranger dans un nouveau tableau.

Merci pour VOS réponses :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 juin 2016, 12:39

C'est pas très clair... peut être que ceci pourra t'aider à y voir plus clair :
echo "Ton tableau comporte " . count($array) . " colonnes<br />"; 
$nbLigneMax = 0;
foreach ($array as $column => $lines) {
       echo "La colonne " . $column . " comporte " count($lines) . " lignes<br />";
       $nbLigneMax = max($nbLigneMax, count($lines) );
}
echo "La colonne la plus longue comporte " . $nbLigneMax . " lignes.";
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 29 Messages

23 juin 2016, 12:48

Pour être plus claire:
j'ai un tableau de 50 lignes.
10% des premières lignes de mon tableau=les 5 premières lignes
30% des dernières lignes=15 dernières lignes

En gros je veux récupérer toute les lignes sauf les 5 premières et 15 dernières.

ViPHP
ViPHP | 1996 Messages

23 juin 2016, 13:59

:-k Hmmm et que fais-tu des tableaux dans tes lignes ?
Je ne comprend pas trop ce que tu veux mais essayes cela :
<?php

$nbLigne = count($array);
$tabLimite = array ("min" => 15, "max" => 70);
$count = 0;
$l1 = 0;
foreach ($array as $cle => $valeur) :
	$l1++;
	if ($l1 > $tabLimite["min"]*$nbLigne/100 && $l1 < $tabLimite["max"]*$nbLigne/100) {
		$count++;
		//si tu veux compter les lignes de tableau supplémentaire c'est ici :
		if (is_array($valeur)) {
			$li2 = 0;
			$nbLigne2 = count($valeur);
			foreach ($valeur as $cle2 => $valeur2) :
				$l2++;
				if ($l2 > $tabLimite["min"]*$nbLigne2/100 && $l2 < $tabLimite["max"]*$nbLigne2/100)
					$count++;
			endforeach;
		}
	}
endforeach;

echo "Nombre de Ligne : ".$nbLigne."<br />";
echo "Nombre en tout : ".$count;

?>
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 juin 2016, 14:12

Ok, donc si ton tableau a la forme indiquée ci-dessus, et que chaque colonne a le même nombre de ligne, tu peux déterminer celui-ci en comptant les lignes de ta première colonne avec count($array['nom'])
$nbLignes = count($array['nom']);
$compteur = 0;
foreach ($array as $column => $line) {
   $compteur++;
   if ($compteur <  $nbLignes *10/100) // on saute les premiers 10%
      continue;

   if ($compteur >= $nbLignes *70/100) // on arrête avant les derniers 30%
      break;

   // traitement ... 

}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 1996 Messages

23 juin 2016, 14:27

C'est plus propre en effet.
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphanteau du PHP | 29 Messages

23 juin 2016, 16:00

Je ne vois pas comment je peux récupérer les valeurs dans un tableau.
$compteur = 0;
foreach ($array as $column => $line) {
   $compteur++;
   if ($compteur <  $nbLigne *10/100) // on saute les premiers 10%
      continue;

   if ($compteur/$nbLigne) *100 >= $nbLigne *70/100) // on arrête avant les derniers 30%
      break;

   $NewArray[line]=$array[line];

}

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 juin 2016, 17:17

Un truc comme ça ?
$compteur = 0;
$NewArray = array();
foreach ($array as $column => $line) {
   $compteur++;
   if ($compteur <  $nbLigne *10/100) // on saute les premiers 10%
      continue;

   if (($compteur/$nbLigne) *100 >= $nbLigne *70/100) // on arrête avant les derniers 30%
      break;

   $NewArray[] = $line;
}

print_r($NewArray);
j'ai ajouté une parenthèse manquante, mais je suis pas sûr de ton $compteur/$nbLigne) *100 par contre...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 29 Messages

24 juin 2016, 10:15

NE fait pas attention au $compteur/$nbLigne) *100 c'est une bêtise de ma part.
Mais par contre quand je lance le code ci-dessus j'ai cette erreur qui s'affiche: "NetworkError: 500 Internal Server Error - http://127.0..../monfichier.php"

Eléphanteau du PHP | 29 Messages

24 juin 2016, 10:36

oft j'avais oublié un ";" :?

Eléphanteau du PHP | 29 Messages

24 juin 2016, 10:42

Voila ce que renvoi print_r (NewArray):
Array (
[0] => Array (
[0] => A [1] => D [2] => B [3] => E [4] => A [5] => D [6] => B [7] => E [8] => A [9] => D )
[1] => Array (
[0] => 3 [1] => 4 [2] => 6 [3] => 5 [4] => 3 [5] => 3 [6] => 6 [7] => 5 [8] => 4 [9] => 6 )
[2] => Array (
[0] => 5 [1] => 4 [2] => 5 [3] => 5 [4] => 3 [5] => 4 [6] => 5 [7] => 6 [8] => 4 [9] => 5 )
)

Tableau de départ:
Array (
[nom] => Array (
[0] => A [1] => D [2] => B [3] => E [4] => A [5] => D [6] => B [7] => E [8] => A [9] => D )
[a] => Array (
[0] => 3 [1] => 4 [2] => 6 [3] => 5 [4] => 3 [5] => 3 [6] => 6 [7] => 5 [8] => 4 [9] => 6 )
=> Array (
[0] => 5 [1] => 4 [2] => 5 [3] => 5 [4] => 3 [5] => 4 [6] => 5 [7] => 6 [8] => 4 [9] => 5 )
)

On remarque qu'il manque juste la première ligne des entêtes (alors que cette ligne devrait être présente dans le nouveau tableau).

$NewArray devrait ressembler à ça:
Array (
[nom] => Array (
[0] => D [2] => B [3] => E [4] => A [5] => D [6] => B )
[a] => Array (
[0] => 4 [2] => 6 [3] => 5 [4] => 3 [5] => 3 [6] => 6 )
=> Array (
[0] => 4 [2] => 5 [3] => 5 [4] => 3 [5] => 4 [6] => 5 )
)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

24 juin 2016, 10:59

C'est plus clair avec un exemple :)

Est-ce que quelque chose comme ça conviendrait ?
$newArray = array();
$nbLignes = count($array['nom']);
foreach ($array as $column => $lines) {
	$compteur = 0;
	$newArray[$column] = array(); 
	foreach ($lines as $id => $val) {
		$compteur++;
		if ($compteur <  $nbLignes *10/100) // on saute les premiers 10%
			continue;
		if ($compteur >= $nbLignes *70/100) // on arrête avant les derniers 30%
			break;
		
		$newArray[$column][$id] = $val;
	}
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...