8302 sujets

Développement web côté serveur, CMS

Bonsoir à tous
Je cherche un tuto clair qui explique quand on peut ou non utiliser des expressions d'array en affectation de variables.
Par exemple (entre autres que j'ai rencontrées des jours-ci) :

$workKey = 'Lewkovitch;3Motetter;_';
list($authorID, $workId, $mvtID) =  explode(';', $workKey); 
/* donne Lewkovitch, NULL, _ */

$items = explode(';', $workKey);
list($authorID, $workId, $mvtID) = $items;
/* donne Lewkovitch, 3Motetter, _ */

Je suppose que dans ce cas là le fait que la 2ème chaîne de caractères commence par un chiffre doit y être pour quelque chose.
Merci de ta réponse.
En fait j'ai fait tellement d'essais que je me suis mélangé les pinceaux. Il semble plutôt que de soit "list" qui coince.
list($authorID, $workId, $mvtID) = preg_split('/;/', $workKey); ne marche pas mieux que list($authorID, $workId, $mvtID) = explode(';', $workKey);
Je n'ai pas trouvé d'autre solution que

$items = explode(';', $workKey);
$authorID = $items[0];
$workID = $items[1];
$mvtID = $items[2];

un peu lourd...
Le mystère s'épaissit:
si je fais un fichier PHP qui ne contient que

$key = 'Lewkovitch;3Motetter;_';
	$items = explode(';', $key);
	list($a, $b, $c) = $items;
	list($d, $e, $f) = explode(';', $key);

j'ai bien "Lewkovitch, 3Motetter,_" dans les deux cas.
Ca doit être dû à un effet de bord dans l'environnement où ça coince, mais je n'ai pas encore trouvé comment c'est possible.
Modifié par PapyJP (09 Mar 2019 - 11:36)
Modérateur
Bonjour,

Le code ci-dessous (ton premier code avec des echos) marche sans problème chez moi. EDIT: testé avec php 7.1.0

$workKey = 'Lewkovitch;3Motetter;_';
list($authorID, $workId, $mvtID) =  explode(';', $workKey); 
echo "a: ".$authorID." ".$workId." ".$mvtID."<br>";
/* affiche a: Lewkovitch 3Motetter _ */
$items = explode(';', $workKey);
list($authorID, $workId, $mvtID) = $items;
echo "b: ".$authorID." ".$workId." ".$mvtID."<br>";
/* affiche b: Lewkovitch 3Motetter _ */


Amicalement,
Modifié par parsimonhi (09 Mar 2019 - 14:46)
Oui, ce qui s'est passé est incompréhensible.
1) j'étais en train d'ajouter une fonction dans un programme qui commençait par:

function bidule($workKey) {
  list($authorID, $workId, $mvtID) =  explode(';', $workKey); 
}

J'ai obtenu de résultat surprenant qui a été la cause pour laquelle j'ai demandé de l'aide: $workID était NULL, la seule façon de contourner le problème étant

$items =  explode(';', $workKey); 
$authorID = $items[0];
$workID = $items[1];
$mvtID = $items[2];

2) le lendemain matin, je regarde ailleurs dans un autre programme où je faisais la même analyse de la même chaîne de caractères, j'avais bien un list(...) = explode(...)
3) je fais un programme de quelques lignes qui confirme que list(...) = explode(...) fonctionne très bien sous PHP5.6 (je ne suis pas passé à PHP7 sur ce site pour ne pas risquer de casser ce qui marche.)
4) je détruis ma fonction et je la réécris de zéro: ça marche correctement!!!
Je n'arrive même pas à imaginer ce qui a pu se passer pour que j'obtienne ce résultat.
Je n'ai pas le souvenir d'une situation semblable en 50 ans de programmation.
Du délire!!!
Modifié par PapyJP (10 Mar 2019 - 10:53)
Modérateur
Bonjour,

Je relis ce post par hasard en cherchant autre chose, et je vois que dans un cas, y a $workId ("d" minuscule à la fin) et que dans un autre cas, y a $workID ("D" majuscule à la fin).

Ça pourrait expliquer !

Amicalement,
parsimonhi a écrit :
Bonjour,

Je relis ce post par hasard en cherchant autre chose, et je vois que dans un cas, y a $workId ("d" minuscule à la fin) et que dans un autre cas, y a $workID ("D" majuscule à la fin).

Ça pourrait expliquer !

Amicalement,

Bien sûr merci de t’en être rendu compte
C’est fou comme on peut passer à côté de choses aussi évidentes !