OVH Cloud OVH Cloud

extensions PHP : retourner un array...

3 réponses
Avatar
Jacques Lebastard
Bonjour,

c'est mon premier post et mon (presque) premier jour en PHP alors merci
d'être indulgent(e).

J'ai donc écrit un module d'extension PHP qui fonctionne à peu près.
Par contre, l'une des fonctions de ce module doit retourner un array de
chaînes de caractères.

Actuellement, ma fonction C se termine ainsi :

array_init(return_value);
next = users;
while ( *next ) {
int i=0;
zval *Next;
MAKE_STD_ZVAL(Next);
ZVAL_STRING(Next, *next, 1);
zend_hash_index_update(HASH_OF(return_value), i, (void *)&Next,
sizeof(zval *), NULL);
free(*next);
next++; i++;
}
}

Pourtant, lorsque j'affiche le contenu de la liste avec :

$ret = get_listOfUser($_POST["node"]);
echo "Liste des utilisateurs sous ".$_POST["node"]." : <br/>";
foreach ( $ret as $user ) {
echo $user."<br/>";
}
echo "<hr/>";

je n'obtiens que le dernier de ma liste. Je suppose que j'utilise mal
zend_hash_index_update() mais même google n'y connais pas grand chose:-(

Qui peut m'aider ?

Où puis-je trouver de la doc (à jour et précise) sur l'API Zend, si
possible avec de jolis exemples simples à comprendre ?

Merci de votre aide,
--
Jacques

3 réponses

Avatar
Jacques Lebastard
Bonjour,

c'est mon premier post et mon (presque) premier jour en PHP alors merci
d'être indulgent(e).

J'ai donc écrit un module d'extension PHP qui fonctionne à peu près.
Par contre, l'une des fonctions de ce module doit retourner un array de
chaînes de caractères.

Actuellement, ma fonction C se termine ainsi :

array_init(return_value);
next = users;
while ( *next ) {
int i=0;
zval *Next;
MAKE_STD_ZVAL(Next);
ZVAL_STRING(Next, *next, 1);
zend_hash_index_update(HASH_OF(return_value), i, (void *)&Next,
sizeof(zval *), NULL);
free(*next);
next++; i++;
}
}


C'était trop simple : il suffit d'utiliser

array_init(return_value);
next = users;
while ( *next ) {
add_next_index_string(return_value, *next, 1);
free(*next);
next++;
}
}

Où puis-je trouver de la doc (à jour et précise) sur l'API Zend, si
possible avec de jolis exemples simples à comprendre ?


Cette question reste valable...

Avatar
John GALLET
Bonjour,

c'est mon premier post et mon (presque) premier jour en PHP
"Bienvenue chez les fous" (tm)


Où puis-je trouver de la doc (à jour et précise) sur l'API Zend,
Comme toujours avec PHP : dans le manuel avant tout.


http://fr2.php.net/manual/en/ chapitre VII et en particulier le point 46
qui pointe vers http://fr2.php.net/manual/en/zend.php

Pour créer un tableau on pourra efficacement consulter
http://fr2.php.net/manual/en/zend.variables.php

si possible avec de jolis exemples simples à comprendre ?
N'oublions pas que nous disposons de **tout** le code source de php...


Le plus simple est de disséquer l'extension mysql :
vi ext/mysql/php_mysql.c


Par rapport au code donné en réponse : attention à bien employer free() et
efree() sur les bonnes variables (je ne sais pas d'où provient le
contenu pointé par next)

a++;
JG

Avatar
Jacques Lebastard
Où puis-je trouver de la doc (à jour et précise) sur l'API Zend,


Comme toujours avec PHP : dans le manuel avant tout.

http://fr2.php.net/manual/en/ chapitre VII et en particulier le point 46
qui pointe vers http://fr2.php.net/manual/en/zend.php


Il semble en effet plus complet que www.manuelphp.com ! Merci pour le tuyau.

Pour créer un tableau on pourra efficacement consulter
http://fr2.php.net/manual/en/zend.variables.php


J'ai presque trouvé ce que je cherchais ces dernières heures :
construire un array d'arrays (voir mon post *très* récent dans
news://comp.lang.php ;-) Je suis à 2 doigts de la solution. Par contre,
il faudra que je prenne le temps pour lire le manuel et comprendre un
peu mieux la gestion de la mémoire entre Apache/PHP et les extensions...

si possible avec de jolis exemples simples à comprendre ?



Je nage comme un fer à repasser °°°°°8-O

N'oublions pas que nous disposons de **tout** le code source de php...

Le plus simple est de disséquer l'extension mysql :
vi ext/mysql/php_mysql.c


J'ai bien pensé à ce genre de solution (avec l'extension PHP pour Clips
que je venais d'intégrer à EasyPHP mais celle-ci utilise beaucoup trop
de macros perso : pas assez zen(d) ;-)

Par rapport au code donné en réponse : attention à bien employer free() et
efree() sur les bonnes variables (je ne sais pas d'où provient le
contenu pointé par next)


Pas de problème de ce côté-là : les données ont bien été allouées par
malloc() *dans* l'extension.

Merci pour ton aide,
--
Jacques.