Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment corriger l'erreur:Notice: Undefined offset: 4 line 512

4 réponses
Avatar
Calimero
Bonjour à tous,

j'ai un petit souci d'erreur d'undefined offset.

Voici mon code:

$travaux = (array)$this->programme->getTravaux();
$tvx = array();
$tvx = $travaux;
if($this->programme->isMaison()):
$ttravaux = array();
foreach((array)$travaux as $tv):
if(!isset($tvx[$tv->getLotsId()]))
$ttravaux[$tv->getLotsId()] ; ==== ligne qui me génère
l'erreur undefined offset

$ttravaux[$tv->getLotsId()][] = $tv;
endforeach;

Sauriez-vous pourquoi j'ai cette erreur? J'ai 2 éléments($tv->getLotsId
()) dans mon tableau et c'est ce deuxième qui pose problème. Merci
d'avance si vous avez une petite idée.

4 réponses

Avatar
Pascal PONCET
Calimero a écrit :
Bonjour à tous,



Bonjour,

j'ai un petit souci d'erreur d'undefined offset.



Donc un élément de tableau non trouvé avec l'indice passé.

$ttravaux[$tv->getLotsId()] ; ==== ligne qui me génère
l'erreur undefined offset



On n'a pas grand chose à se mettre sous la dent pour déterminer l'erreur
. On ne sait pas ce que ramènent les méthodes "getTravaux()" et
"getLotsId()".

Sauriez-vous pourquoi j'ai cette erreur? J'ai 2 éléments($tv->getLotsId
()) dans mon tableau et c'est ce deuxième qui pose problème. Merci
d'avance si vous avez une petite idée.



Et bien, la question globale c'est de savoir si les indices ramenés par
"$tv->getLotsId()" correspondent ou non à des positions d'éléments qui
existent dans le tableau "$ttravaux".

Cordialement,
Pascal
Avatar
Antoine Polatouche
Calimero a écrit :
Bonjour à tous,


Bonsoir,

j'ai un petit souci d'erreur d'undefined offset.



Ce n'est pas une erreur, mais une 'notice', comme spécifié dans le titre
de ton message. (voir réglages dans php.ini pour ça)

Voici mon code:

$travaux = (array)$this->programme->getTravaux();
$tvx = array();
$tvx = $travaux;
if($this->programme->isMaison()):
$ttravaux = array();
foreach((array)$travaux as $tv):
if(!isset($tvx[$tv->getLotsId()]))
$ttravaux[$tv->getLotsId()] ; ==== ligne qui me génère
l'erreur undefined offset

$ttravaux[$tv->getLotsId()][] = $tv;
endforeach;

Sauriez-vous pourquoi j'ai cette erreur? J'ai 2 éléments($tv->getLotsId
()) dans mon tableau et c'est ce deuxième qui pose problème. Merci
d'avance si vous avez une petite idée.



Tu voulais qu'elle fasse quoi cette ligne ???
Si tu voulais initialiser une cellule avec un tableau, tu aurais pu
faire $ttravaux[$tv->getLotsId()]=array();
mais $ttravaux[$tv->getLotsId()][] = $tv; fait le boulot tout seul.
Avatar
Bruno Desthuilliers
Calimero a écrit :
Bonjour à tous,

j'ai un petit souci d'erreur d'undefined offset.

Voici mon code:

$travaux = (array)$this->programme->getTravaux();



Si $this->programme->getTravaux() retourne un array, est-il nécessaire
de le caster ?

$tvx = array();



crée un tableau et l'associe à l'identifiant $tvx

$tvx = $travaux;



associe le tableau existant $travaux à l'identifiant $tvx - ce qui
remplace l'assignation précédente, par conséquent inutile.

if($this->programme->isMaison()):



L'intérêt premier de la POO est d'éviter autant que possible les
branchements "manuels" de ce type. $this->programme devrait savoir quoi
faire par lui-même...

$ttravaux = array();



pas très clair comme nommage... entre $travaux et $ttravaux, on a vite
fait de s'embrouiller.

foreach((array)$travaux as $tv):



$travaux est *déjà* un tableau. Pourquoi re-caster ?

if(!isset($tvx[$tv->getLotsId()]))



Je rappelle qu'arrivé ici, $tvx et $travaux sont le même tableau. Tu es
sûr de ce que tu es en train de faire ?

$ttravaux[$tv->getLotsId()] ; ==== ligne qui me génère
l'erreur undefined offset



Et qui de plus ne sert à rien.

Cette instruction essaie d'accéder à l'indice $tv->getLotsId() du
tableau $ttravaux. A la première itération (au moins...), cet indice
n'est pas défini dans ce tableau[1], ce que te signale d'ailleur le
message d'erreur. En tout état de cause, même si cet indice est défini,
tu ne fais rien de son contenu.


[1] en simplifiant, ça revient à:
$tableau = array();
$tableau[42];
si tu ne vois pas où est l'erreur, il serait probablement temps
d'apprendre php.


$ttravaux[$tv->getLotsId()][] = $tv;



créé un tableau (s'il n'existe pas déjà) à l'indice $tv->getLotsId() et
y ajoute une référence sur $tv.

Accessoirement, ça fait trois fois que tu appelles la même méthode sur
le même objet. Une variable locale pourrait aider question perfs...

endforeach;



il manquerait pas un endif ?


Sauriez-vous pourquoi j'ai cette erreur? J'ai 2 éléments($tv->getLotsId
()) dans mon tableau et c'est ce deuxième qui pose problème. Merci
d'avance si vous avez une petite idée.



Comme on ne sait pas ce que tu cherches à faire, c'est difficile de
corriger. Donc on va commencer par réécrire ça un poil plus lisiblement:


$travaux = $this->programme->getTravaux();

if ($this->programme->isMaison()) {
// identifiant débile, mais au moins on ne confond plus
$machin = array();
foreach ($travaux as $tv) {
$lotsId = $tv->getLotsId();

// je persiste à ne pas comprendre à quoi ce test
// est supposé servir...
// tu ne te serais pas mélangé entre $travaux et $ttravaux,
// par hasard ? Et il ne manquerait pas un truc du genre
// '= array()' avant le point-virgule ?

if (! isset($travaux[$lotsId])) {
$machin[$lotsId] ; // WTF ?
}

$machin[$lotsId][] = $tv;
}
}

Bon, je suppose que l'idée est de regrouper les travaux par id de lot ?

Si oui, ça ressemblerait plutôt à ça:

$travaux = $this->programme->getTravaux();

if ($this->programme->isMaison()) {
$travauxParIdLot = array();

foreach ($travaux as $tv) {
$lotsId = $tv->getLotsId();

// pas indispensable mais éventuellement plus propre
if (! isset($travauxParId[$lotsId])) {
$travauxParIdLot[$lotsId] = array();
}

$travauxParIdLot[$lotsId][] = $tv;
}
}

Sinon, je poste de ce pas ce code au dailyWTF...
Avatar
Mickael Wolff
Calimero a écrit :
if(!isset($tvx[$tv->getLotsId()]))
$ttravaux[$tv->getLotsId()] ;



En français on peut lire ces deux phrase comme suit :

si l'offset $tv->getLotsId() n'existe pas dans $tvx.
alors lire l'offset $tv->getLotsId() de $ttravaux


Tu as un problème de logique ici. Ne sachant pas ce que tu souhaite
faire, je ne peux pas deviner ce qu'il faut que tu écrives.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org