Discussion:
Comment corriger l'erreur:Notice: Undefined offset: 4 line 512
(trop ancien pour répondre)
Calimero
2008-12-30 15:39:51 UTC
Permalink
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.
Pascal PONCET
2008-12-31 01:48:46 UTC
Permalink
Post by Calimero
Bonjour à tous,
Bonjour,
Post by Calimero
j'ai un petit souci d'erreur d'undefined offset.
Donc un élément de tableau non trouvé avec l'indice passé.
Post by Calimero
$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()".
Post by Calimero
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
Antoine Polatouche
2008-12-31 01:48:46 UTC
Permalink
Post by Calimero
Bonjour à tous,
Bonsoir,
Post by Calimero
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)
Post by Calimero
$travaux = (array)$this->programme->getTravaux();
$tvx = array();
$tvx = $travaux;
$ttravaux = array();
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.
Bruno Desthuilliers
2008-12-31 01:48:46 UTC
Permalink
Post by Calimero
Bonjour à tous,
j'ai un petit souci d'erreur d'undefined offset.
$travaux = (array)$this->programme->getTravaux();
Si $this->programme->getTravaux() retourne un array, est-il nécessaire
de le caster ?
Post by Calimero
$tvx = array();
crée un tableau et l'associe à l'identifiant $tvx
Post by Calimero
$tvx = $travaux;
associe le tableau existant $travaux à l'identifiant $tvx - ce qui
remplace l'assignation précédente, par conséquent inutile.
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...
Post by Calimero
$ttravaux = array();
pas très clair comme nommage... entre $travaux et $ttravaux, on a vite
fait de s'embrouiller.
$travaux est *déjà* un tableau. Pourquoi re-caster ?
Post by Calimero
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 ?
Post by Calimero
$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.
Post by Calimero
$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...
Post by Calimero
endforeach;
il manquerait pas un endif ?
Post by Calimero
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...
Mickael Wolff
2008-12-31 01:48:46 UTC
Permalink
Post by Calimero
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
Loading...