Sommaire
Créer des variables
Présentation
Longs (Entiers)
Doubles (nombres à virgule flottante)
Chaînes de caractères
Booléens
Tableaux
Objets
Ressources
Les macros de création automatiques de variables globales
Creating Constants
|
7.11.6 Tableaux
Les tableaux sont stockés dans les tables de hash internes de Zend,
qui sont accessibles avec les API zend_hash_*.
Pour chaque tableau que vous voulez créer, vous avez besoin d'une nouvelle
référence sur une table de hash, qui sera stockée dans le membre
ht de l'enveloppe zval.value.
Il y a toute une collection d'API uniquement pour la création de tableaux,
qui est particulièrement pratique. Pour créer un nouveau tableau, vous
pouvez appeler array_init.
zval *new_array;
MAKE_STD_ZVAL(new_array);
if(array_init(new_array) != SUCCESS)
{
// Gestion d'erreur ici.
}
Si array_init échoue à la création d'un tableau,
elle retourne FAILURE.
Pour ajouter de nouveaux éléments à un tableau, vous pouvez
utiliser de nombreuses fonctions, suivant ce que vous souhaitez faire.
<>,
<> et
<>
décrivent ces fonctions. Toutes les fonctions retourne
FAILURE en cas d'échec, et
SUCCESS en cas de succès.
API Zend pour les tableaux associatifs
>
>
Fonction |
Description |
add_assoc_long(zval *array, char *key, long n); |
Ajoute un élément de type long. |
add_assoc_unset(zval *array, char *key); |
Ajoute un élément inexistant (unset). |
add_assoc_bool(zval *array, char *key, int b); |
Ajoute un élément de type booléen. |
add_assoc_resource(zval *array, char *key, int r); |
Ajoute un élément de type ressource. |
add_assoc_double(zval *array, char *key, double d); |
Ajoute un élément de type double. |
add_assoc_string(zval *array, char *key, char *str, int duplicate); |
Ajoute un élément de type chaîne de caractères. L'option duplicate
spécifie si le contenu de la chaîne doit être dupliqué depuis la mémoire
interne de Zend.
|
add_assoc_stringl(zval *array, char *key, char *str, uint length, int duplicate);
|
Ajoute un élément de type chaîne de caractères, avec la longueur length.
Sinon, cette fonction se comporte exactement comme add_assoc_string.
|
API Zend pour les tableaux indexés, 1ère Partie
>
>
Function |
Description |
add_index_long(zval *array, uint idx, long
n); |
Ajoute un élément de type long. |
add_index_unset(zval *array, uint
idx); |
Ajoute un élément inexistant (unset). |
add_index_bool(zval *array, uint idx, int
b); |
Ajoute un élément de type booléen. |
add_index_resource(zval *array, uint idx, int
r); |
Ajoute un élément de type ressource. |
add_index_double(zval *array, uint idx, double
d); |
Ajoute un élément de type nombre à virgule flottante. |
add_index_string(zval *array, uint idx, char
*str, int duplicate); |
Ajoute un élément de type chaîne de caractères.
L'option duplicate spécifie si le conten de la chaîne doit être
copié, à partir de la mémoire interne Zend. |
add_index_stringl(zval *array, uint idx, char
*str, uint length, int duplicate); |
Ajoute un élément de type chaîne de caractères,
avec la longueur length. Cette fonction est bien plus rapide
et elle est compatible avec les chaînes binaires. Sinon
elle se comporte exactement comme add_index_string().
|
API Zend pour les tableaux indexés, 2ème Partie
>
>
Fonction |
Description |
add_next_index_long(zval *array, long
n); |
Ajoute un élément de type long. |
add_next_index_unset(zval
*array); |
Ajoute un élément inexistant (unset). |
add_next_index_bool(zval *array, int
b); |
Ajoute un élément de type booléen. |
add_next_index_resource(zval *array, int
r); |
Ajoute un élément de type ressource. |
add_next_index_double(zval *array, double
d); |
Ajoute un élément de type nombre à virgule flottante. |
add_next_index_string(zval *array, char *str,
int duplicate); |
Ajoute un élément de type chaîne de caractères.
L'option duplicate spécifie si le conten de la chaîne doit être
copié, à partir de la mémoire interne Zend. |
add_next_index_stringl(zval *array, char *str,
uint length, int duplicate); |
Ajoute un élément de type chaîne de caractères,
avec la longueur length. Cette fonction est bien plus rapide
et elle est compatible avec les chaînes binaires. Sinon
elle se comporte exactement comme add_index_string(). |
Toutes ces fonctions fournissent une interface d'abstraction du moteur Zend
pratique. Bien entendu, vous pouvez aussi utiliser les fonctions de tables
de hash directement (par exemple, si vous avez une enveloppe zval
déjà allouée que vous voulez insérer dans un tableau existant. Cela se fait
avec la fonction zend_hash_update()
pour les tableaux associatifs (voir <>) et
zend_hash_index_update pour les tableaux indexés
(voir <>):
Ajouter un élément dans un tableau associatif. |
zval *new_array, *new_element;
char *key = "element_key";
MAKE_STD_ZVAL(new_array);
MAKE_STD_ZVAL(new_element);
if(array_init(new_array) == FAILURE)
{
// Gestion des erreurs
}
ZVAL_LONG(new_element, 10);
if(zend_hash_update(new_array->value.ht, key, strlen(key) + 1, (void *)&new_element, sizeof(zval *), NULL) == FAILURE)
{
// do error handling here
}
| Ajouter un élément à un tableau indexé. |
zval *new_array, *new_element;
int key = 2;
MAKE_STD_ZVAL(new_array);
MAKE_STD_ZVAL(new_element);
if(array_init(new_array) == FAILURE)
{
// Gestion des erreurs
}
ZVAL_LONG(new_element, 10);
if(zend_hash_index_update(new_array->value.ht, key, (void *)&new_element, sizeof(zval *), NULL) == FAILURE)
{
// Gestion des erreurs
}
|
Pour émuler la fonctionnalité de
add_next_index_*, vous pouvez faire ceci :
zend_hash_next_index_insert(ht, zval **new_element, sizeof(zval *), NULL)
Note: Pour retourner un tableau depuis une
fonction, utilisez array_init et
toutes les actions suivantes sur la variable prédéfinie return_value
(fournie en argument de votre fonction exportée; voyez
plus tôt dans ce chapitre la discussion sur l'interface). Vous
n'avez pas à utiliser MAKE_STD_ZVAL sur cette variable.
Tip: Pour éviter d'avoir à écrire
new_array->value.ht à chaque fois, vous pouvez
utiliser HASH_OF(new_array), qui est aussi recommandé
pour des raisons de compatibilité.
|