OVH Cloud OVH Cloud

initialiser un tableau avec une variable

10 réponses
Avatar
Jacques Lebastard
Bonjour à tou(te)s,

je cherche à initialiser une variable array avec une autre variable
contenant la valeur initiale du tableau associatif:

. saisie de "att1" => "val1", "att2" => "val2" dans le champ "TABLEAU"
d'un formulaire envoyé en POST à un script PHP

. $monArray=array($_REQUEST['TABLEAU']);

J'obtiens alors un Array indexé dont l'unique élément est la chaine saisie:
Array ( [0] "att1" => "val1", "att2" => "val2" )

Comment faire pour initialiser $monArray à
Array ( [att1] val1 [att2] val2 )


Je voudrais éviter les split() et les explode() ;-)

10 réponses

Avatar
Olivier Miakinen

je cherche à initialiser une variable array avec une autre variable
contenant la valeur initiale du tableau associatif:

. saisie de "att1" => "val1", "att2" => "val2" dans le champ "TABLEAU"
d'un formulaire envoyé en POST à un script PHP

. $monArray=array($_REQUEST['TABLEAU']);

J'obtiens alors un Array indexé dont l'unique élément est la chaine saisie:
Array ( [0] "att1" => "val1", "att2" => "val2" )

Comment faire pour initialiser $monArray à
Array ( [att1] val1 [att2] val2 )

Je voudrais éviter les split() et les explode() ;-)


Et preg_replace_callback() tu veux bien ?

Je tente (non testé) :

<?php

function add_element($matches)
{
global $monArray; // c'est le plus gros défaut de cette solution
$monArray[$matches[1]] = $matches[2];
}

$monArray = array();
(void) preg_replace_callback('/"(.*)" => "(.*)"/U', 'add_element',
$_REQUEST['TABLEAU']);

?>

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
Olivier Miakinen

[ $_REQUEST['TABLEAU'] = '"att1" => "val1", "att2" => "val2"' ]

. $monArray=array($_REQUEST['TABLEAU']);


Et preg_replace_callback() tu veux bien ?


Tiens, j'ai trouvé mieux, mais c'est plus cher (PHP 5 requis).

<?php
preg_match_all('/"(.*)" => "(.*)"/U', $_REQUEST['TABLEAU'], $matches);
$monArray = array_combine($matches[1], $matches[2]);
?>

Deux lignes... qui dit mieux ? ;-)
(bon, faut tester les codes d'erreur, quand même...)

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)


Avatar
ftc
[ $_REQUEST['TABLEAU'] = '"att1" => "val1", "att2" => "val2"' ]

. $monArray=array($_REQUEST['TABLEAU']);
Et preg_replace_callback() tu veux bien ?



Tiens, j'ai trouvé mieux, mais c'est plus cher (PHP 5 requis).

<?php
preg_match_all('/"(.*)" => "(.*)"/U', $_REQUEST['TABLEAU'], $matches);
$monArray = array_combine($matches[1], $matches[2]);
?>

Deux lignes... qui dit mieux ? ;-)
(bon, faut tester les codes d'erreur, quand même...)



1 ligne:

eval('$monArray = array('.$_REQUEST['TABLEAU'].');');

Mais c'est fortement à proscrire à moins d'avoir bien filtrer l'entrée.

Je pense aussi que la solution à base de preg_match est une bonne solution.



Avatar
Olivier Miakinen

[ $_REQUEST['TABLEAU'] = '"att1" => "val1", "att2" => "val2"' ]



<?php
preg_match_all('/"(.*)" => "(.*)"/U', $_REQUEST['TABLEAU'], $matches);
$monArray = array_combine($matches[1], $matches[2]);
?>

Deux lignes... qui dit mieux ? ;-)


1 ligne:
eval('$monArray = array('.$_REQUEST['TABLEAU'].');');


Rien à dire (sauf ce qui suit).

Mais c'est fortement à proscrire à moins d'avoir bien filtré l'entrée.


Absolument, et ça nécessiterait beaucoup plus qu'une ligne
supplémentaire pour bien le faire.

Je pense aussi que la solution à base de preg_match est une bonne solution.


Pour faire sans array_combine() (mais avec foreach, faut pas déconner
quand même ; on n'en est plus à PHP3) :

<?php
preg_match_all('/"(.*)" => "(.*)"/U',
$_REQUEST['TABLEAU'], $matches,
PREG_SET_ORDER);
$monArray = array();
foreach ($matches as $match) {
$monArray[ $match[1] ] = $match[2];
}
?>


--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)




Avatar
Jacques Lebastard

[ $_REQUEST['TABLEAU'] = '"att1" => "val1", "att2" => "val2"' ]

. $monArray=array($_REQUEST['TABLEAU']);


Et preg_replace_callback() tu veux bien ?



Tiens, j'ai trouvé mieux, mais c'est plus cher (PHP 5 requis).


Tu connais nos petits moyens ... ;-)

Comme le petit Nicolas, je pense à ma journée en me rasant le matin...
Je me suis donc demandé si ça ne serait pas beaucoup plus simple s'il
n'y avait pas tous ces " inutiles dans $_REQUEST['TABLEAU'] ...

J'essaie dès demain matin (après rasage : on n'est pas à l'abri d'une
autre idée)

<?php
preg_match_all('/"(.*)" => "(.*)"/U', $_REQUEST['TABLEAU'], $matches);
$monArray = array_combine($matches[1], $matches[2]);


Pourquoi ne commencer qu'à [1] ? Que contient [0] ?
[N'hésite pas à répondre RTFM...]

?>

Deux lignes... qui dit mieux ? ;-)
(bon, faut tester les codes d'erreur, quand même...)





Avatar
Jacques Lebastard
eval('$monArray = array('.$_REQUEST['TABLEAU'].');');


Une petite explication s'impose quant à la présence (que *je* trouve
surprenante) des ' et des . : je me disais que les ' assurent que
la variable est bien prise dans son ensemble (?) mais les . restent un
mystère...
Autre question : à quoi sert l'eval ?

Mais c'est fortement à proscrire à moins d'avoir bien filtrer l'entrée.

Je pense aussi que la solution à base de preg_match est une bonne solution.


Avatar
Olivier Miakinen

eval('$monArray = array('.$_REQUEST['TABLEAU'].');');


Une petite explication s'impose quant à la présence (que *je* trouve
surprenante) des ' et des . : je me disais que les ' assurent que
la variable est bien prise dans son ensemble (?) mais les . restent un
mystère...


RTFM...

La syntaxe des chaînes :
http://fr.php.net/manual/fr/language.types.string.php

L'opérateur de concaténation :
http://fr.php.net/manual/fr/language.operators.string.php

Autre question : à quoi sert l'eval ?


http://fr.php.net/manual/fr/function.eval.php

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)


Avatar
Olivier Miakinen

Tiens, j'ai trouvé mieux, mais c'est plus cher (PHP 5 requis).


Tu connais nos petits moyens ... ;-)


Je peux te coder facilement une fonction array_combine() mais nul doute
que tu saches le faire aussi.

Comme le petit Nicolas, je pense à ma journée en me rasant le matin...
Je me suis donc demandé si ça ne serait pas beaucoup plus simple s'il
n'y avait pas tous ces " inutiles dans $_REQUEST['TABLEAU'] ...


Bien sûr que oui. Une syntaxe plus simple pourrait-être par exemple :

nom1=valeur1
nom2=valeur2
nom3=valeur3

... mais tu ne précisais pas d'où venait la syntaxe décrite.

<?php
preg_match_all('/"(.*)" => "(.*)"/U', $_REQUEST['TABLEAU'], $matches);
$monArray = array_combine($matches[1], $matches[2]);


Pourquoi ne commencer qu'à [1] ? Que contient [0] ?
[N'hésite pas à répondre RTFM...]


Je n'hésite pas, d'ailleurs je l'ai déjà fait pour ton autre article.
http://fr3.php.net/manual/fr/function.preg-match-all.php

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)


Avatar
Jacques Lebastard
eval('$monArray = array('.$_REQUEST['TABLEAU'].');');


Une petite explication s'impose quant à la présence (que *je* trouve
surprenante) des ' et des . : je me disais que les ' assurent que
la variable est bien prise dans son ensemble (?) mais les . restent un
mystère...



RTFM...


Il faut être indulgent : c'était dimanche soir...
Ce matin, tout est plus clair. Mieux : tout fonctionne.

Merci à ftc et à Olivier.



Avatar
Jacques Lebastard
Bien sûr que oui. Une syntaxe plus simple pourrait-être par exemple :

nom1=valeur1
nom2=valeur2
nom3=valeur3

... mais tu ne précisais pas d'où venait la syntaxe décrite.


Tant que je ne sais pas faire des formulaires HTML à géométrie variable,
je n'ai pas d'autre choix que de demander à l'utilisateur de saisir la
chaîne d'initialisation de l'array.

Si j'ai le temps un jour j'essaierai de proposer une belle interface
HTML pour construire l'array à partir d'un formulaire qui proposera les
clés et les valeurs à partir de listes connues.



<?php
preg_match_all('/"(.*)" => "(.*)"/U', $_REQUEST['TABLEAU'], $matches);
$monArray = array_combine($matches[1], $matches[2]);


Pourquoi ne commencer qu'à [1] ? Que contient [0] ?
[N'hésite pas à répondre RTFM...]



Je n'hésite pas, d'ailleurs je l'ai déjà fait pour ton autre article.
http://fr3.php.net/manual/fr/function.preg-match-all.php