SommaireTelecharger la documentationChapitre suivantChapitre precedent  

  .: News :.: Edito :.: Scripts :.: Forum :.: Erreurs :.: Jobs :. 
 
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-&gt;value.ht à chaque fois, vous pouvez utiliser HASH_OF(new_array), qui est aussi recommandé pour des raisons de compatibilité.


Chapitre précédentChapitre suivantAccueil nexen.net