OVH Cloud OVH Cloud

comment differencier tableau et tableau associatif

7 réponses
Avatar
Marc
bonjour.

Je souhaiter creer une classe permettant d'afficher une liste de
selection. Cette liste est alimentée par des tableaux associatifs ou pas
. Voici un exemple :


$a1 = array('x', 'y', 'z');

$page->add(new ItemSelect('a1', 'A1', $a1));


$a2 = array(
"a" => 1,
"b" => 2,
"c" => 3
);

$page->add(new ItemSelect('a2', 'A2', $a2));

dans ma methode :

class ItemSelect{

...

function to_html(){

echo "<tr>\n<td>{$this->title}</td>\n";
echo "<td><select name='{$this->name}'>\n";
foreach($this->list as $key=>$value){
echo "<option value='$key'>$value</option>\n";
}
echo "</select></td>\n</tr>\n";
}
}

dans ce contexte, j'ai 2 formes de listes a generer :

<option value='$key'>$value</option>

ou

<option value='$value'>$value</option>


* array_keys() renvoie toujours une valeur. quelque soit la forme de la
liste passée en argument,
* donc il faudrait verifier si array_keys[0] est un entier ou une
chaine, mais ca me plais moyen.

z'avez pas une idée lumineuse ?

7 réponses

Avatar
Yttrium
"Marc" <mquinton| a écrit dans le message de news:
42b2a3b8$0$9152$


* array_keys() renvoie toujours une valeur. quelque soit la forme de la
liste passée en argument,
* donc il faudrait verifier si array_keys[0] est un entier ou une
chaine, mais ca me plais moyen.


Bonjour,

Cela me semble pourtant la meilleure solution, qu'est ce qui vous déplait ?

Salutations.

--
Yttrium
Jetez un oeil à http://www.danstesyeux.com

Avatar
ftc
[SNIP]
* array_keys() renvoie toujours une valeur. quelque soit la forme de la
liste passée en argument,
* donc il faudrait verifier si array_keys[0] est un entier ou une
chaine, mais ca me plais moyen.



J'utilise ceci que j'avais trouvé dans les commentaires de la doc PHP:

function is_assoc($var) {
return is_array($var) && array_keys($var)!==range(0,sizeof($var)-1);
}

Avatar
bruno modulix
Marc wrote:
bonjour.

Je souhaiter creer une classe permettant d'afficher une liste de
selection. Cette liste est alimentée par des tableaux associatifs ou pas
. Voici un exemple :


(snip)


* array_keys() renvoie toujours une valeur. quelque soit la forme de la
liste passée en argument,
* donc il faudrait verifier si array_keys[0] est un entier ou une
chaine, mais ca me plais moyen.

z'avez pas une idée lumineuse ?


Le problème est qu'en réalité, les "listes" PHP *sont* des tableaux
associatifs:

$ar = Array(1, 2, 3);
$ar[42] = 42;
var_dump($ar);
echo "<br>n";
for ($i = 0; $i < count($ar); $i++) {
echo "$ar[$i] is {$ar[$i]}<br>n";
}

$ar2 = Array("a"=>1, "b"=>2, "c"=>3);
$ar2[] = 42;
var_dump($ar2);

Amusant, non ?
<hs mode="groumf">
Au passage, essaie aussi ça:
$ar = Array("1" => 1, "2" => 2, "toto" => 3);
var_dump($ar);
</hs>

Bref, AMHA, il faut une autre approche:
- soit 2 variantes de la classe ItemSelect (une qui utilise les clés,
l'autre pas)
- soit un paramètre supplémentaire qui précise s'il faut utiliser les
clés ou pas...

Mes deux centimes...

--
bruno desthuilliers
ruby -e "print ''.split('@').collect{|p|
p.split('.').collect{|w| w.reverse}.join('.')}.join('@')"

Avatar
bruno modulix
Yttrium wrote:
"Marc" <mquinton| a écrit dans le message de news:
42b2a3b8$0$9152$

* array_keys() renvoie toujours une valeur. quelque soit la forme de la
liste passée en argument,
* donc il faudrait verifier si array_keys[0] est un entier ou une
chaine, mais ca me plais moyen.



Cela me semble pourtant la meilleure solution, qu'est ce qui vous déplait ?



$ar = Array("toto" => "bidule", "1" => "machin");
$ar[] = "gotcha";
var_dump($ar);

HTH
--
bruno desthuilliers
ruby -e "print ''.split('@').collect{|p|
p.split('.').collect{|w| w.reverse}.join('.')}.join('@')"


Avatar
Marc

function is_assoc($var) {
return is_array($var) && array_keys($var)!==range(0,sizeof($var)-1);
}


merci bcp pour cette lecture si précise de la page de manuel, et surtout
des commentaires associés ...

Avatar
bruno modulix
ftc wrote:
(snip)

function is_assoc($var) {
return is_array($var) && array_keys($var)!==range(0,sizeof($var)-1);
}


Pas mal... Effectivement, ça devrait résoudre le problème de l'OP

--
bruno desthuilliers
ruby -e "print ''.split('@').collect{|p|
p.split('.').collect{|w| w.reverse}.join('.')}.join('@')"

Avatar
ftc
Le problème est qu'en réalité, les "listes" PHP *sont* des tableaux
associatifs:

$ar = Array(1, 2, 3);
$ar[42] = 42;
var_dump($ar);
echo "<br>n";
for ($i = 0; $i < count($ar); $i++) {
echo "$ar[$i] is {$ar[$i]}<br>n";
}

$ar2 = Array("a"=>1, "b"=>2, "c"=>3);
$ar2[] = 42;
var_dump($ar2);

Amusant, non ?


Là, le problème n'est pas que les listes soient des tableaux mais
d'avoir un développeur qui manque quand même un peu de rigueur ;-)

Ce n'est pas parce que les variables ne sont pas typées et les tableaux
n'ont pas de limites définies qu'il faut faire n'importe quoi.

Tout serait plus simple si il y avait deux types différents, mais avec
un minimum de rigueur et de cohérence, on s'en sort.