Argl ! saloperie de conversion automatique :(

Le
Bruno Desthuilliers
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;
}

echo "ar2 : <br>"; var_dump($ar2); echo "<br>";
echo "ar3 : <br>"; var_dump($ar3); echo "<br>";
echo "ar4 : <br>"; var_dump($ar4); echo "<br>";
echo "ar5 : <br>"; var_dump($ar4); echo "<br>";
?>

Celui qui me sort la solution gagne ma reconnaissance éternelle

D'avance merci,
Bruno
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
loquace
Le #590227
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
Bruno Desthuilliers
Le #590465
Bruno Desthuilliers wrote:
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

John Gallet
Le #590223
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
Le #590224
loquace wrote:
Ben si tu veux conserver ton id as string essaie la fonction srtval()
strval($id);
Déjà testé. C'est au moment d'utiliser la chaine comme clé dans le

tableau que PHP la transforme en integer :-(

extrait du bout de code posté :
foreach($ar as $key=>$val) {
$key = strval($key);
assert(is_string($key)) or die("failed in ar3");
$ar3[$key] = $val;
}
echo "ar3 : <br>"; var_dump($ar3); echo "<br>";

mais comme php comprend tout seul ce qu'il recoit parfois c un peu
cavalier pour des besoin particuliers


"Cavalier"... Oui, c'est le mot que je cherchais !-)
Bon, j'ai résolu (enfin... hacké) le problème (cf dans cd thread). Mais
merci quand même !-)

Bruno

Bruno Desthuilliers
Le #587985
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



m-e-
Le #590220
"Bruno Desthuilliers" 409670a3$0$27680$
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 :

<?php
$a = array("0" => "zéro", "1" => "un");
var_dump($a);
?>

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 ?

John Gallet
Le #587983
$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
Le #587981
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 :

http://fr2.php.net/manual/en/language.types.array.php

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 #587793
Le 04 May 2004 13:47:49 GMT, John Gallet
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).

Cdlt
Stéph'

--
AcroDict : Dictionnaire francophone des acronymes informatiques
PHP Page : Script PHP3 Gratuits (Forum, Gestionnaires BDD, etc..)

Bruno Desthuilliers
Le #589682
m-e- wrote:
(snip)



De toute évidence, cela ce produit aussi en définissant directement le tableau :

<?php
$a = array("0" => "zéro", "1" => "un");
var_dump($a);
?>

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 ?-)


Publicité
Poster une réponse
Anonyme