Newsgroup: it.comp.www.php
Titolo: Scoperto adesso: chiavi numeriche di array

In realtà scoperto qualche giorno fa e mi appresto adesso a patchare.
$array["ciao"] = true;
rimane tale, mentre
$array["123"] = true;
diventa
$array[123] = true;
Che cazzata colossale!
Una cantonata che da PHP non mi aspettavo proprio.
E se non ho capito male, da manuale
$array["123.456"] = true;
diventa
$array[123] = true;
Che vergogna, che onta.

 $array[123] = true;
No, resta cosě com'č.
-- 
ValeRyo
XT600 "Katoki Pajama" - 
http://www.slimmit.com/go.asp?7Y9
GamerTag: 
http://card.mygamercard.net/IT/nxe/ValeRyo76.png
 

Che vergogna, che onta.
Forse valeva la pena fare una prova veloce:
$ php -q
<?php
        $a = array('123.123' => 'Buon Anno!');
        print_r($a);
?>
Array
(
    [123.123] => Buon Anno!
)
Leonardo
-- 
Enough, enough!  But, stranger, ere we part,
Glancing farewell to each nefarious bier,
This warning would I beg you take to heart:
There is an end to e'en the worst career!

 Forse valeva la pena fare una prova veloce:
Così mi pareva dicesse da manuale. Buono per chi ha chiavi numeriche con 
decimali. Io invece mi trovo con un problematico miscuglio di chiavi 
stringa e chiavi numeriche.

 No, resta così com'è.
Fidati. :)
Fai un var_dump dell'array.

 Fai un var_dump dell'array.
Fatto, e resta cos� com'�.
Perch�, a te 123.123 diventa davvero 123 ?




A meno che tu non stia contanto sull'ordinamento delle chiavi (sbagliato, 
visto che gli array in PHP in realta` sono hashtable), non dovrebbe 
interessarti.
In ogni caso puoi usare strval per assicurarti di inserire stringhe anche 
quando sembrano numeri:
$array[strval($key)] = $value;
Bye.

 Perché, a te 123.123 diventa davvero 123 ?
Sì è vero, lo avevo letto ma non avevo verificato. Il mio problema 
comunque è un altro e cioè che "123" diventa 123. E questo purtroppo 
l'ho verificato ed è vero.

 $array[strval($key)] = $value;
Non cambia nulla:
$key = "123";
$array[strval($key)] = true;
array(1) { [123]=> bool(true) }

confermo, anche usando strval il valore viene preso come integer:
$k = "123";
$y = "foo";
$a = array(
    strval($k) => 'numeri in stringa',
    strval($y) => 'stringa',
    '123.456' => 'float'
);
foreach($a AS $key => $val)
{
    echo gettype($key) . '<br />';
}
print_r($a);
//output:
integer
string
string
Array ( [123] => numeri in stringa [foo] => stringa [123.456] =>
float )
però scusa, perchè non usi strval quando fai il confronto?

 però scusa, perchè non usi strval quando fai il confronto?
Come ho detto sono elenchi testuali che vengono confrontati.
Ad esempio nell'elenco 1 ho
ciao["uno"]["due"]
ciao["11"]
ciao["pippo"]
e nell'elenco 2 ho
ciao[11]
ciao["pippo"]
L'elenco 1 contiene l'elenco delle variabili nella forma corretta.
L'elenco 2 contiene l'elenco delle variabili per come sono contenute 
nell'array $ciao .
Il confronto testuale fra i nomi di variabili fallisce quando c'è di 
mezzo la chiave "11":
( "ciao[\"11\"]" == "ciao[11]" )
= false
In origine "11" è stringa, ma nell'elenco 2 che è generato dal contenuto 
dell'array $ciao , viene trovata come numerica cioè 11 perché PHP ha 
convertito il tipo.
Questo causa un bug che si manifesta solo quando ci sono di mezzo chiavi 
numeriche.
Non posso forzare a stringa tutte le chiavi dell'elenco 2 con strval(), 
perché l'elenco 2 potrebbe essere generato per un array che avrebbe 
dovuto contenere chiavi davvero numeriche e nell'elenco 1 potrebbero 
essere inserite per il confronto variabili con la giusta chiave numerica.
Siccome l'elenco 1 ha i tipi giusti e l'elenco 2 ha i tipi in alcuni 
casi sbagliati, non posso forzare i tipi a stringa dell'elenco 2 perché 
andrebbe bene quando i tipi giusti sono stringa ma non andrebbe bene 
quando i tipi giusti sono numerici.
Allora la soluzione che ho trovato è modificare i tipi dell'elenco 1 
nello stesso modo con cui li altera PHP, così le variabili verranno 
trovate nell'elenco 2 che è l'elenco di variabili contenute in un array, 
quindi con chiavi già alterate da PHP.
PERO' CHE PALLE!

array.
Non mi torna granchè: se è un elenco di variabili... "123" non è una
variabile.
Se hai un elenco di dati, generici, dovresti averlo nei valori dell'
array, non nelle chiavi.


 mezzo la chiave "11":
Da dove ti arrivano questi dati?
Da quanto scrivevi non ne hai il controllo, giusto? Sono dati che ti 
arrivano da applicazioni terze?
Nel qual caso, se permetti un consiglio senza agitarti :), ti conviene 
comunque modificare i codici che dovrai usare come chiavi secondo una 
struttura a te nota.
es. COD + codice pervenuto + progressivo a n cifre.
L'ideale sarebbe passare per un db con più campi adeguatamente 
indicizzati, se ho intuito correttamente cosa devi fare (non trollare, 
spero ;-)).

 array, non nelle chiavi.
L'elenco è un elenco di variabili, anche array, con specifica della chiave.
Si tratta di un gestore di sessione e relative variabili di sessione. E' 
in grado di dirimere collissioni fra variabili/array di sessione fra 
quelle in memoria e quelle salvate su file system (per esempio 
modificate da una pagina partita dopo e terminata prima di quella 
corrente), es. cosa fare se la pagina ha la variabile 
miao["xxx"]["yyy"]=12 e su file system c'è miao["xxx"]["yyy"]=13 o 
miao["xxx"]["zzz"]=14 o la pagina vuole l'unset di miao["xxx"]["yyy"] e 
su file system miao["xxx"]["yyy"] è presente.
L'elenco può assomigliare a qualcosa di simile:
pippo
pluto
paperino[]
miao["xxx"]["yyy"]
ugo[123]
Comunque non fa niente, ho già risolto. E ci saranno sicuramente modi 
migliori di fare tutto quanto. Ma il ribaltare tutto e la 
retrocompatibilità su un progetto costantemente in sviluppo da 10 anni 
non è uno scherzo.