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

Argl ! saloperie de conversion automatique :(

10 réponses
Avatar
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

10 réponses

Avatar
Bruno Desthuilliers
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

Avatar
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
Avatar
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


Avatar
Bruno Desthuilliers
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

Avatar
m-e-
"Bruno Desthuilliers" a écrit dans le message de news:
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 ?

Avatar
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



Avatar
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


Avatar
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 :

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

Avatar
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).

Cdlt
Stéph'

--
AcroDict : Dictionnaire francophone des acronymes informatiques
<URL:http://www.teaser.fr/~spineau/acrodict/index.htm>
PHP Page : Script PHP3 Gratuits (Forum, Gestionnaires BDD, etc..)
<URL:http://steph.pineau.free.fr/php/index.php>

Avatar
Bruno Desthuilliers
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 ?-)