2010-10-19 5 views
1

Après des heures de débogage, j'ai trouvé une erreur dans l'un de mes scripts. Pour enregistrer différents types d'événements dans une base de données, j'ai un tableau de données uniques pour chaque événement qui peut être utilisé pour identifier l'événement.Unifier les types de variables des éléments du tableau

J'ai donc essentiellement un code comme

$key = md5(json_encode($data)); 

pour générer une clé unique pour chaque événement.

Maintenant, dans certains cas, une valeur dans le tableau $data est un entier, parfois une chaîne (en fonction de son origine - base de données ou URL). Cela provoque les sorties de json_encode() à être différentes les unes des autres, mais - une fois y compris les citations, une fois pas.

Est-ce que quelqu'un sait comment "unifier" les types de variables dans le tableau $data? Cela signifierait probablement convertir toutes les chaînes qui contiennent uniquement une valeur entière en nombre entier. Y at-il autre chose dont je dois m'occuper en utilisant json_encode()?

+1

Sur une note côté, la plupart des événements dans notre base de données (évidemment en plus de ceux créés de manière erronée) sont maintenant basé sur des chaînes, il peut être préférable de convertir les entiers en chaînes au lieu de le faire dans l'autre sens. – Franz

+0

Je pensais suggérer que, si tout ce dont vous avez besoin est un hachage cohérent, mais je n'étais pas sûr de ce que vous utilisiez pour ... – tobyodavies

+0

Oui, j'ai besoin d'un hachage cohérent, c'est ce dont il s'agit. – Franz

Répondre

2

array_walk_recursive combiné avec une fonction que vous avez écrit à l'effet de maybe_intval qui effectue la conversion dont vous parlez sur un seul élément.

EDIT: après avoir lu la documentation array_walk_recursive plus près que vous aurez envie vraiment d'écrire votre propre fonction récursive

function to_json($obj){ 
    if(is_object($obj)) 
    $obj=(array)$obj; 
    if(is_array($obj)) 
    return array_map('to_json',$obj); 
    return "$obj"; // or return is_int($obj)?intval($obj):$obj; 
} 
+0

J'aime l'édition. Je vais rapporter, merci. – Franz

+0

Pourquoi pas 'array_walk_recursive', cependant? – Franz

+0

Ok, j'ai utilisé 'array_map' (la récursivité n'est pas nécessaire) avec une simple fonction de conversion int-to-string. Merci pour votre aide. – Franz

Questions connexes