[RESOLU] Undefined offset avec la fonction 'in_array'

Petit nouveau ! | 8 Messages

29 avr. 2019, 10:36

Bonjour,

J'essaie d'extraire des tableaux à partir d'un chaîne de caractères, et j'obtiens invariablement un message d'erreur de Php. Message d'erreur non bloquant, puisque Php renvoie les résultats attendus.

Voici deux variations de mon code...
$entrees = ['A', '1', '3', '5', '1', '3', 'B', '2', '4', '6', '4', '6', 'C'];

$i = -1;

$caracteres = [];

foreach($entrees as $entree) {

	if (is_numeric($entree)) {

		$caracteres[$i][] = $entree;
		
	} else {
	
		$i++;
	
	}
	
}

print_r($caracteres);
Là, rien à dire, ça fonctionne. :)
$entrees = ['A', '1', '3', '5', '1', '3', 'B', '2', '4', '6', '4', '6', 'C'];

$i = -1;

$caracteres = [];

foreach($entrees as $entree) {

	if (is_numeric($entree)) {
	
		if (!in_array($entree, $caracteres[$i])) {

			$caracteres[$i][] = $entree;
			
		}
		
	} else {
	
		$i++;
	
	}
	
}

print_r($caracteres);
Là Php grogne... Il me dit qu'il ne connaît pas l'offset à la ligne
 if (!in_array($entree, $caracteres[$i]))
et qu'il attend un tableau comme paramètre. Pourtant, il affiche les résultats.

Deux remarques...
1. Le but n'est pas de séparer les caractères alphabétiques et numériques. Mon code est nettement plus complexe.
2. Mes tableaux ne peuvent pas compter de doublons pour que mon algorithme fonctionne.

Merci pour vos aides et vos avis. :)

Terebenthine.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

29 avr. 2019, 11:07

Quel est le message d'erreur exact ?
à priori je dirai que tu appelles un $i du tableau $caractères qui n'existe pas et le $i problématique est indiqué dans le message d'erreur
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 8 Messages

29 avr. 2019, 13:45

@@rthur Merci pour ton aide.

Les messages d'erreur sont :
NOTICE Undefined offset: 0 on line number 12
WARNING in_array() expects parameter 2 to be array, null given on line number 12
NOTICE Undefined offset: 1 on line number 12
WARNING in_array() expects parameter 2 to be array, null given on line number 12
Cette ligne 12 correspond à :
if (!in_array($entree, $caracteres[$i])) {
J'ai peut-être trouvé la solution sous réserve de tests, avec array_values (array_unique préserve les clefs). Dans ce cas, inutile de tester si la valeur n'existe pas, puisque c'est l'origine de la difficulté.
foreach ($caracteres as $cle => $tableau) {
	
	$caracteres[$cle] = array_values($caracteres[$cle]);
	
}
C'est du bricolage, certes. :)

Encore merci.

Térébenthine.

Petit nouveau ! | 8 Messages

29 avr. 2019, 14:25

...

Après tests, il faut plutôt écrire :
foreach ($motifs as $cle=> $tableau) {
	
	$caracteres[$cle] = array_values(array_unique($caracteres[$cle]));
	
}
Pour que cette boucle fonctionne, le compteur d'origine doit commencer avec 0 et pas avec -1.

:)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

29 avr. 2019, 14:34

Ou plus simplement, tu vérifies que cette entrée du tableau existe avant de vérifier sa valeur.

Ton code :
if (!in_array($entree, $caracteres[$i])) {
Avec cette petite vérification additionnelle :
if (isset($caracteres[$i]) && !in_array($entree, $caracteres[$i])) {
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 8 Messages

29 avr. 2019, 14:58

@@arthur Merci !