Salut à vous tous, et désolez pour le léger mouvement d'humeur illustré
par le subject de ce post !-)
Bon, mon probleme :
je récupere des valeurs (dans une base, mais c'est sans importance) sous
la forme
id:int=> label:string
Je veux les affecter à un array sous la forme
id:string => label:string
... et quoi que je fasse :
$ar[(string)$id] = $label
$ar[strval($id)] = $label
settype($id, 'string'); $ar[$id] = $label;
je me retrouve toujour avec la clé re-convertie en entier :(
Petit bout de code qui illustre le problème :
<?php
$ar = Array(1=> 'un', 2 => 'deux');
foreach($ar as $key=>$val) {
$key = (string)$key;
assert(is_string($key)) or die("failed in ar2");
$ar2[$key] = $val;
}
foreach($ar as $key=>$val) {
$key = strval($key);
assert(is_string($key)) or die("failed in ar3");
$ar3[$key] = $val;
}
foreach($ar as $key=>$val) {
settype($key, 'string');
assert(is_string($key)) or die("failed in ar4");
$ar4[$key] = $val;
}
foreach($ar as $key=>$val) {
$key = "$key";
assert(is_string($key)) or die("failed in ar5");
$ar5[$key] = $val;
}
Salut à vous tous, et désolez pour le léger mouvement d'humeur illustré par le subject de ce post !-)
Bon, mon probleme : je récupere des valeurs (dans une base, mais c'est sans importance) sous la forme id:int=> label:string
Je veux les affecter à un array sous la forme id:string => label:string
... et quoi que je fasse : $ar[(string)$id] = $label $ar[strval($id)] = $label settype($id, 'string'); $ar[$id] = $label;
je me retrouve toujour avec la clé re-convertie en entier :(
Bon, bin je me répond à moi-même : le seul hack que j'ai trouvé, c'est
d'ajouter un "0" devant la clé :
foreach($ar as $key=>$val) { $ar5["0$key"] = $val; }
foreach ($ar5 as $key=>$val) { assert(is_string($key)); assert(is_numeric((int) $key)); }
Qui dit mieux ?
Bruno
loquace
Ben si tu veux conserver ton id as string essaie la fonction srtval() strval($id); de meme l'inverse intval(); mais comme php comprend tout seul ce qu'il recoit parfois c un peu cavalier pour des besoin particuliers mais je n'ai jamais eu ce soucis. Seb
Ben si tu veux conserver ton id as string essaie la fonction srtval()
strval($id);
de meme l'inverse intval();
mais comme php comprend tout seul ce qu'il recoit parfois c un peu
cavalier pour des besoin particuliers mais je n'ai jamais eu ce soucis.
Seb
Ben si tu veux conserver ton id as string essaie la fonction srtval() strval($id); de meme l'inverse intval(); mais comme php comprend tout seul ce qu'il recoit parfois c un peu cavalier pour des besoin particuliers mais je n'ai jamais eu ce soucis. Seb
John Gallet
Bruno Desthuilliers wrote:
$ar[(string)$id] = $label foreach($ar as $key=>$val)
$ar5["0$key"] = $val; Qui dit mieux ?
Le faire dès le remplissage. Mais j'ai du mal à voir pourquoi
$ar["$id"]=$label;
ne fonctionnerait pas comme tu le souhaites (besoin qui m'échappe totalement d'ailleurs vu que la clef est égale à l'indice).
a++ JG
Bruno Desthuilliers wrote:
$ar[(string)$id] = $label
foreach($ar as $key=>$val)
$ar5["0$key"] = $val;
Qui dit mieux ?
Le faire dès le remplissage. Mais j'ai du mal à voir pourquoi
$ar["$id"]=$label;
ne fonctionnerait pas comme tu le souhaites (besoin qui m'échappe
totalement d'ailleurs vu que la clef est égale à l'indice).
Et cela a été abordé dans les commentaires pour l'instruction "array" (http://fr2.php.net/manual/en/function.array.php - 21-Feb-2004 12:42). On peut supposer que PHP tente automatiquement une conversion (simple) en entier de la chaîne avant l'indexation. Mais dans quel but ?
"Bruno Desthuilliers" <bdesth.quelquechose@free.quelquepart.fr> a écrit dans le message de news:
409670a3$0$27680$636a15ce@news.free.fr...
Salut à vous tous, et désolez pour le léger mouvement d'humeur illustré
par le subject de ce post !-)
Bon, mon probleme :
je récupere des valeurs (dans une base, mais c'est sans importance) sous
la forme
id:int=> label:string
Je veux les affecter à un array sous la forme
id:string => label:string
... et quoi que je fasse :
$ar[(string)$id] = $label
$ar[strval($id)] = $label
settype($id, 'string'); $ar[$id] = $label;
je me retrouve toujour avec la clé re-convertie en entier :(
[...]
De toute évidence, cela ce produit aussi en définissant directement le tableau :
Et cela a été abordé dans les commentaires pour l'instruction "array" (http://fr2.php.net/manual/en/function.array.php - 21-Feb-2004
12:42). On peut supposer que PHP tente automatiquement une conversion (simple) en entier de la chaîne avant l'indexation. Mais dans
quel but ?
Et cela a été abordé dans les commentaires pour l'instruction "array" (http://fr2.php.net/manual/en/function.array.php - 21-Feb-2004 12:42). On peut supposer que PHP tente automatiquement une conversion (simple) en entier de la chaîne avant l'indexation. Mais dans quel but ?
Bruno Desthuilliers
John Gallet wrote:
Bruno Desthuilliers wrote:
$ar[(string)$id] = $label
foreach($ar as $key=>$val) $ar5["0$key"] = $val; Qui dit mieux ?
Le faire dès le remplissage. Mais j'ai du mal à voir pourquoi
$ar["$id"]=$label;
ne fonctionnerait pas comme tu le souhaites
Parce qu'à l'affectation, la clé est convertie en entier (cf snippet dans premier post)
(besoin qui m'échappe totalement d'ailleurs
C'est pour mettre dans un select, et j'ai besoin d'avoir une entrée dans le select dont la valeur soit connue à l'avance et ne puisse pas être un id dans la base. Il y a probablement d'autres moyens d'y arriver, mais celui-là était le plus simple a priori (et déjà en place pour un autre select 2 lignes plus bas, mais avec des chaines comme id...).
Bruno
John Gallet wrote:
Bruno Desthuilliers wrote:
$ar[(string)$id] = $label
foreach($ar as $key=>$val)
$ar5["0$key"] = $val;
Qui dit mieux ?
Le faire dès le remplissage. Mais j'ai du mal à voir pourquoi
$ar["$id"]=$label;
ne fonctionnerait pas comme tu le souhaites
Parce qu'à l'affectation, la clé est convertie en entier (cf snippet
dans premier post)
(besoin qui m'échappe
totalement d'ailleurs
C'est pour mettre dans un select, et j'ai besoin d'avoir une entrée dans
le select dont la valeur soit connue à l'avance et ne puisse pas être un
id dans la base. Il y a probablement d'autres moyens d'y arriver, mais
celui-là était le plus simple a priori (et déjà en place pour un autre
select 2 lignes plus bas, mais avec des chaines comme id...).
foreach($ar as $key=>$val) $ar5["0$key"] = $val; Qui dit mieux ?
Le faire dès le remplissage. Mais j'ai du mal à voir pourquoi
$ar["$id"]=$label;
ne fonctionnerait pas comme tu le souhaites
Parce qu'à l'affectation, la clé est convertie en entier (cf snippet dans premier post)
(besoin qui m'échappe totalement d'ailleurs
C'est pour mettre dans un select, et j'ai besoin d'avoir une entrée dans le select dont la valeur soit connue à l'avance et ne puisse pas être un id dans la base. Il y a probablement d'autres moyens d'y arriver, mais celui-là était le plus simple a priori (et déjà en place pour un autre select 2 lignes plus bas, mais avec des chaines comme id...).
Bruno
John Gallet
$ar["$id"]=$label; Parce qu'à l'affectation, la clé est convertie en entier (cf snippet
dans premier post)
Dans ton article tu indiques divers casts. J'ai bien indiqué $ar[DOUBLEQUOTE$idDOUBLEQUOTE]=$label; La même chose que ce que tu indiques sans mettre un zéro devant. Fais gaffe d'ailleurs que précéder un entier de zéro le convertir en Octal... Donc s'il a une "feature" fais attention que si ça se trouve tu as une conversion en octal au passage :-)
C'est pour mettre dans un select, et j'ai besoin d'avoir une entrée dans le select dont la valeur soit connue à l'avance et ne puisse pas être un id dans la base.
J'ai toujours pas compris. Tu disposes d'un tableau associatif dont la clef est un entier. Pour une sombre raison tu veux que ce soit une string. Admettons que col2 et col3 sont des types (VAR)CHAR.
for($i=0; $i<10; $i++) { $query="SELECT col1 FROM ... WHERE col2='{$ar[$i]}' AND col 3 ='$i' "; ... } suppose que tes indices soient séquentiels. Imaginons donc qu'ils ne le soient pas, tu peux alors écrire :
foreach ($ar as $key => $value) { $query=SELECT col1 FROM ... WHERE col2='$value' AND col 3 ='$key' "; ... }
Mais on se fiche totalement de savoir si $i est un entier ou une string en PHP. Il n'y a AUCUN lien entre le type SQL et le type PHP pour un entier/float SQL qui peut être une string en PHP, on s'en fiche.
Donc je n'ai toujours pas compris la question ;-)
a++ JG
$ar["$id"]=$label;
Parce qu'à l'affectation, la clé est convertie en entier (cf snippet
dans premier post)
Dans ton article tu indiques divers casts. J'ai bien indiqué
$ar[DOUBLEQUOTE$idDOUBLEQUOTE]=$label; La même chose que ce que tu
indiques sans mettre un zéro devant. Fais gaffe d'ailleurs que précéder
un entier de zéro le convertir en Octal... Donc s'il a une "feature"
fais attention que si ça se trouve tu as une conversion en octal au
passage :-)
C'est pour mettre dans un select, et j'ai besoin d'avoir une entrée dans
le select dont la valeur soit connue à l'avance et ne puisse pas être un
id dans la base.
J'ai toujours pas compris. Tu disposes d'un tableau associatif dont la
clef est un entier. Pour une sombre raison tu veux que ce soit une
string.
Admettons que col2 et col3 sont des types (VAR)CHAR.
for($i=0; $i<10; $i++)
{
$query="SELECT col1 FROM ...
WHERE col2='{$ar[$i]}'
AND col 3 ='$i' ";
...
}
suppose que tes indices soient séquentiels. Imaginons donc qu'ils ne le
soient pas, tu peux alors écrire :
foreach ($ar as $key => $value)
{
$query=SELECT col1 FROM ...
WHERE col2='$value'
AND col 3 ='$key' ";
...
}
Mais on se fiche totalement de savoir si $i est un entier ou une string
en PHP.
Il n'y a AUCUN lien entre le type SQL et le type PHP pour un
entier/float SQL qui peut être une string en PHP, on s'en fiche.
$ar["$id"]=$label; Parce qu'à l'affectation, la clé est convertie en entier (cf snippet
dans premier post)
Dans ton article tu indiques divers casts. J'ai bien indiqué $ar[DOUBLEQUOTE$idDOUBLEQUOTE]=$label; La même chose que ce que tu indiques sans mettre un zéro devant. Fais gaffe d'ailleurs que précéder un entier de zéro le convertir en Octal... Donc s'il a une "feature" fais attention que si ça se trouve tu as une conversion en octal au passage :-)
C'est pour mettre dans un select, et j'ai besoin d'avoir une entrée dans le select dont la valeur soit connue à l'avance et ne puisse pas être un id dans la base.
J'ai toujours pas compris. Tu disposes d'un tableau associatif dont la clef est un entier. Pour une sombre raison tu veux que ce soit une string. Admettons que col2 et col3 sont des types (VAR)CHAR.
for($i=0; $i<10; $i++) { $query="SELECT col1 FROM ... WHERE col2='{$ar[$i]}' AND col 3 ='$i' "; ... } suppose que tes indices soient séquentiels. Imaginons donc qu'ils ne le soient pas, tu peux alors écrire :
foreach ($ar as $key => $value) { $query=SELECT col1 FROM ... WHERE col2='$value' AND col 3 ='$key' "; ... }
Mais on se fiche totalement de savoir si $i est un entier ou une string en PHP. Il n'y a AUCUN lien entre le type SQL et le type PHP pour un entier/float SQL qui peut être une string en PHP, on s'en fiche.
Donc je n'ai toujours pas compris la question ;-)
a++ JG
John Gallet
Dans ton article tu indiques divers casts.
Raté il avait pas vu le $ar5 qui était très proche avec l'affectation de $key="$key".
D'ailleurs visiblement faut pas chercher à comprendre, c'est comme ça que ça marche :
A key may be either an integer or a string. If a key is the standard representation of an integer, it will be interpreted as such (i.e. "8" will be interpreted as 8, while "08" will be interpreted as "08").
Donc je n'ai toujours pas compris la question ;-)
Ca toujours pas en effet. Je n'ai jamais dû m'apercevoir du problème parce que ça a toujours été transparent pour les cas que j'avais à traiter.
a++ JG
Dans ton article tu indiques divers casts.
Raté il avait pas vu le $ar5 qui était très proche avec l'affectation de
$key="$key".
D'ailleurs visiblement faut pas chercher à comprendre, c'est comme ça
que ça marche :
A key may be either an integer or a string. If a key is the standard
representation of an integer, it will be interpreted as such (i.e. "8"
will be interpreted as 8, while "08" will be interpreted as "08").
Donc je n'ai toujours pas compris la question ;-)
Ca toujours pas en effet. Je n'ai jamais dû m'apercevoir du problème
parce que ça a toujours été transparent pour les cas que j'avais à
traiter.
A key may be either an integer or a string. If a key is the standard representation of an integer, it will be interpreted as such (i.e. "8" will be interpreted as 8, while "08" will be interpreted as "08").
Donc je n'ai toujours pas compris la question ;-)
Ca toujours pas en effet. Je n'ai jamais dû m'apercevoir du problème parce que ça a toujours été transparent pour les cas que j'avais à traiter.
a++ JG
Stephane Pineau
Le 04 May 2004 13:47:49 GMT, John Gallet écrivait:
indiques sans mettre un zéro devant. Fais gaffe d'ailleurs que précéder un entier de zéro le convertir en Octal... Donc s'il a une "feature" fais attention que si ça se trouve tu as une conversion en octal au passage :-)
Remarque judicieuse.... ca me rapelle de mauvais souvenirs ca :-< J'm'étais amusé à préfixer par un 0 les index d'un tableau de messages d'une appli pour les padder sur deux (ou 3 ?) caractères (de manière à avoir un alignement propre)... bref $msg[07], $msg[08], $msg[09], $msg[10] etc...
Ca pas loupé.... encore une belle prise de tête pour comprendre pourquoi certains messages n'étaient pas chargés en mémoire.... c'était du à cette foutue interpétation, j'avais certains index en octal, d'autre en décimal, avec certain écrasant les autres....(au passage 08, et 09 ne sont pas des valeurs octales correctes. Je me demande d'ailleurs comment PHP les type car il ne génèrait pas d'erreur au chargement du tableau (du moins dans la version que j'utilisais une 3 quelconque).
Le 04 May 2004 13:47:49 GMT, John Gallet <john.gallet@wanadoo.fr> écrivait:
indiques sans mettre un zéro devant. Fais gaffe d'ailleurs que précéder
un entier de zéro le convertir en Octal... Donc s'il a une "feature"
fais attention que si ça se trouve tu as une conversion en octal au
passage :-)
Remarque judicieuse.... ca me rapelle de mauvais souvenirs ca :-< J'm'étais
amusé à préfixer par un 0 les index d'un tableau de messages d'une appli
pour les padder sur deux (ou 3 ?) caractères (de manière à avoir un
alignement propre)... bref $msg[07], $msg[08], $msg[09], $msg[10] etc...
Ca pas loupé.... encore une belle prise de tête pour comprendre pourquoi
certains messages n'étaient pas chargés en mémoire.... c'était du à cette
foutue interpétation, j'avais certains index en octal, d'autre en décimal,
avec certain écrasant les autres....(au passage 08, et 09 ne sont pas des
valeurs octales correctes. Je me demande d'ailleurs comment PHP les type car
il ne génèrait pas d'erreur au chargement du tableau (du moins dans la
version que j'utilisais une 3 quelconque).
Le 04 May 2004 13:47:49 GMT, John Gallet écrivait:
indiques sans mettre un zéro devant. Fais gaffe d'ailleurs que précéder un entier de zéro le convertir en Octal... Donc s'il a une "feature" fais attention que si ça se trouve tu as une conversion en octal au passage :-)
Remarque judicieuse.... ca me rapelle de mauvais souvenirs ca :-< J'm'étais amusé à préfixer par un 0 les index d'un tableau de messages d'une appli pour les padder sur deux (ou 3 ?) caractères (de manière à avoir un alignement propre)... bref $msg[07], $msg[08], $msg[09], $msg[10] etc...
Ca pas loupé.... encore une belle prise de tête pour comprendre pourquoi certains messages n'étaient pas chargés en mémoire.... c'était du à cette foutue interpétation, j'avais certains index en octal, d'autre en décimal, avec certain écrasant les autres....(au passage 08, et 09 ne sont pas des valeurs octales correctes. Je me demande d'ailleurs comment PHP les type car il ne génèrait pas d'erreur au chargement du tableau (du moins dans la version que j'utilisais une 3 quelconque).
Et cela a été abordé dans les commentaires pour l'instruction "array" (http://fr2.php.net/manual/en/function.array.php - 21-Feb-2004 12:42). On peut supposer que PHP tente automatiquement une conversion (simple) en entier de la chaîne avant l'indexation. Mais dans quel but ? Celui de faire ch... le programmeur ?-)
m-e- wrote:
(snip)
De toute évidence, cela ce produit aussi en définissant directement le tableau :
Et cela a été abordé dans les commentaires pour l'instruction "array" (http://fr2.php.net/manual/en/function.array.php - 21-Feb-2004
12:42). On peut supposer que PHP tente automatiquement une conversion (simple) en entier de la chaîne avant l'indexation. Mais dans
quel but ?
Celui de faire ch... le programmeur ?-)
Et cela a été abordé dans les commentaires pour l'instruction "array" (http://fr2.php.net/manual/en/function.array.php - 21-Feb-2004 12:42). On peut supposer que PHP tente automatiquement une conversion (simple) en entier de la chaîne avant l'indexation. Mais dans quel but ? Celui de faire ch... le programmeur ?-)