IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Comparer deux array (json) et voir des diff de clé


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 197
    Par défaut Comparer deux array (json) et voir des diff de clé
    Bonjour,
    j'espère être au bon endroit.

    J'ai un petit problème avec les fonctions récursives que j'ai jamais vraiment comprit.
    Je reçois un json que je récup de youtube, mais il peut être modifié comme ces clés et je dois m'assurer d'être prévenu si les clés changent.
    J'ai donc fait une "copie"(indiqué original) que je veux le comparer avec le second pour voir si toute les clés sont identique jusqu'a la valeur "text"(sert a rien juste pour avoir quelque chose) et si rien a changer je peux utiliser les données.

    Les données pour mon test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    // Original:
    $test['header']['pageHeaderRenderer']['content']['pageHeaderViewModel']['banner']['imageBannerViewModel']['image']['sources'][0]['url'] = 'text';
    $test['metadata']['channelMetadataRenderer']['title'] = 'text';
    $test['metadata']['channelMetadataRenderer']['description'] = 'text';
    $test['metadata']['channelMetadataRenderer']['rssUrl'] = 'text';
    $test['metadata']['channelMetadataRenderer']['avatar']['thumbnails'][0]['url'] = 'text';
    $test['metadata']['channelMetadataRenderer']['keywords'] = 'text';
    $test['metadata']['channelMetadataRenderer']['ownerUrls'] = 'text';
    $test['metadata']['channelMetadataRenderer']['channelUrl'] = 'text';
    $test['contents']['twoColumnBrowseResultsRenderer']['tabs'][1]['tabRenderer']['content']['richGridRenderer']['contents'][0]['richItemRenderer']['content']['videoRenderer']['videoId'] = 'text';
    $test['contents']['twoColumnBrowseResultsRenderer']['tabs'][1]['tabRenderer']['content']['richGridRenderer']['contents'][0]['richItemRenderer']['content']['videoRenderer']['thumbnail']['thumbnails'][1]['url'] = 'text';
    $test['contents']['twoColumnBrowseResultsRenderer']['tabs'][1]['tabRenderer']['content']['richGridRenderer']['contents'][0]['richItemRenderer']['content']['videoRenderer']['title']['runs'][0]['text'] = 'text';
    $test['contents']['twoColumnBrowseResultsRenderer']['tabs'][1]['tabRenderer']['content']['richGridRenderer']['contents'][0]['richItemRenderer']['content']['videoRenderer']['descriptionSnippet']['runs'][0]['text'] = 'text';
    $test['contents']['twoColumnBrowseResultsRenderer']['tabs'][1]['tabRenderer']['content']['richGridRenderer']['contents'][0]['richItemRenderer']['content']['videoRenderer']['lengthText']['accessibility']['accessibilityData']['label'] = 'text';
    $test['contents']['twoColumnBrowseResultsRenderer']['tabs'][1]['tabRenderer']['content']['richGridRenderer']['contents'][0]['richItemRenderer']['content']['videoRenderer']['navigationEndpoint']['commandMetadata']['webCommandMetadata']['url'] = 'text';
    // var_dump_($test);
     
    // Le json a comparer avec des clés différentes parfois:
    $test2['header']['pageHeaderRenderer']['content']['pageHeaderViewModel']['banner']['imageBannerViewModel']['image']['sources'][0]['url'] = 'text';
    $test2['metadata']['channelMetadataRenderer']['title'] = 'text';
    $test2['metadata']['AchannelMetadataRenderer']['description'] = 'text';
    $test2['metadata']['channelMetadataRenderer']['rssUrl'] = 'text';
    $test2['metadata']['channelMetadataRenderer']['avatar']['thumbnails'][0]['url'] = 'text';
    $test2['metadata']['channelMetadataRenderer']['keywords'] = 'text';
    $test2['metadata']['channelMetadataRenderer']['ownerUrls'] = 'text';
    $test2['metadata']['channelMetadataRenderer']['channelUrl'] = 'text';
    $test2['contents']['twoColumnBrowseResultsRenderer']['tabs'][1]['tabRenderer']['content']['richGridRenderer']['contents'][0]['richItemRenderer']['content']['videoRenderer']['videoId'] = 'text';
    $test2['Acontents']['twoColumnBrowseResultsRenderer']['tabs'][1]['tabRenderer']['content']['richGridRenderer']['contents'][0]['richItemRenderer']['content']['videoRenderer']['thumbnail']['thumbnails'][1]['url'] = 'text';
    $test2['contents']['twoColumnBrowseResultsRenderer']['tabs'][1]['tabRenderer']['content']['richGridRenderer']['contents'][0]['richItemRenderer']['content']['videoRenderer']['title']['runs'][0]['text'] = 'text';
    $test2['contents']['twoColumnBrowseResultsRenderer']['tabs'][1]['tabRenderer']['content']['richGridRenderer']['contents'][0]['richItemRenderer']['content']['videoRenderer']['descriptionSnippet']['runs'][0]['text'] = 'text';
    $test2['contents']['twoColumnBrowseResultsRenderer']['tabs'][1]['tabRenderer']['content']['richGridRenderer']['contents'][0]['richItemRenderer']['content']['videoRenderer']['lengthText']['accessibility']['accessibilityData']['label'] = 'text';
    $test2['contents']['twoColumnBrowseResultsRenderer']['tabs'][1]['tabRenderer']['content']['richGridRenderer']['contents'][0]['richItemRenderer']['content']['videoRenderer']['navigationEndpoint']['commandMetadata']['webCommandMetadata']['url'] = 'text';
    J'ai voulu faire une fonction récursive et boucler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    function rec($data, $data2) {
    	foreach ($data as $key => $value)
    	{
    		if(is_array($value) AND !empty($data2[$key]))
    			{
    				rec($value, $data2[$key]);
    			}
    		else
    			{
    				if(!empty($data2[$key]))
    					{
    						var_dump_($key);
    					}
    				else
    					{
    						var_dump_("existe pas <==============================="); // On doit tout arrêter si on arrive ici et renvoyer un false pour dire qu'on a un problème
    						return false;
    					}
    			}
    	}
    	return true;
    }
    J'arrive a voir quand j'ai une clé différente, mais jarrive pas a arrêter tout le code pour que ma fonction renvoie false a la première clé différente. Quelqu'un aurait une idée comment je peux m'y prendre pour faire cela ?

    EDIT:

    J'ai réussi on dirait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    	/*
    	true: aucun problème
    	false: on a un problème
    	*/
    	private function rec($data, $data2, $result = array('error' => true)) {
    		foreach ($data as $key => $value)
    		{
    			if(is_array($value) AND !empty($data2[$key]))
    				{
    					$result = rec($value, $data2[$key], $result);
    				}
    			else
    				{
    					if(!empty($data2[$key]))
    						{
    							// var_dump_($key);
    						}
    					else
    						{
    							// var_dump_("existe pas <===============================");
    							$result['error'] = false;
    						}
    				}
    		}
    		return $result;
    	}
    Je sais pas si c'est optimisé, mais ça a l'air de fonctionner

  2. #2
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mars 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2023
    Messages : 33
    Par défaut
    Salut, voici peut être un peu mieux ta fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    /**
     * Compare récursivement les clés de deux tableaux associatifs.
     *
     * @param array $original Les données originales.
     * @param array $compare Les données à comparer.
     * @param string $path Le chemin actuel dans l'arborescence (utilisé pour le débogage).
     * @param array &$differences Référencé pour accumuler les différences trouvées.
     * @return bool true si aucune différence n'est trouvée, false sinon.
     */
    function rec(array $original, array $compare, $path = '', &$differences = []) {
        // Parcourt chaque clé dans le tableau original
        foreach ($original as $key => $value) {
            // Construit le chemin complet de la clé
            $currentPath = $path === '' ? $key : "$path -> $key";
     
            // Vérifie si la clé existe dans le tableau à comparer
            if (!array_key_exists($key, $compare)) {
                $differences[] = "Clé manquante dans le second JSON: $currentPath";
                // Continue l'exploration pour trouver toutes les différences
                continue;
            }
     
            // Si la valeur est un tableau, appelle la fonction récursivement
            if (is_array($value) && is_array($compare[$key])) {
                $result = rec($value, $compare[$key], $currentPath, $differences);
                // Si une différence est trouvée dans les sous-clés, marquer comme erreur
                if (!$result) {
                    // Pas nécessaire de faire quoi que ce soit ici puisque les différences sont déjà accumulées
                    // Mais on peut continuer pour trouver toutes les différences
                }
            }
        }
     
        // (Optionnel) Vérifie les clés supplémentaires dans le tableau à comparer
        foreach ($compare as $key => $value) {
            if (!array_key_exists($key, $original)) {
                $currentPath = $path === '' ? $key : "$path -> $key";
                $differences[] = "Clé supplémentaire dans le second JSON: $currentPath";
            }
        }
     
        // Retourne true si aucune différence n'a été trouvée, sinon false
        return empty($differences);
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 197
    Par défaut
    Merci chatGPT, bot ou humain ?^^
    Ta fonction est complexe, moi je voulais juste savoir si j'ai une seul différence et tout arrêter, car je ne peux pas avoir de différence pour que le script fonctionne.
    Merci

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Citation Envoyé par Lprofessionnelle Voir le message
    Merci chatGPT, bot ou humain ?^^
    Ta fonction est complexe, moi je voulais juste savoir si j'ai une seul différence et tout arrêter, car je ne peux pas avoir de différence pour que le script fonctionne.
    Merci
    Tu peux très bien reprendre sa fonction en la modifiant un peu pour l'interrompre à la première différence trouvée.

  5. #5
    Membre confirmé
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 197
    Par défaut
    Oui bien entendu, je vais essayer, mais concrètement la mienne est bien ? Il manque une condition je pense pour ne pas continuer quand on a trouver un problème a part ça je la trouve pas si mal

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Je n'ai pas vérifié en détail les deux fonctions, mais une chose me choque dans la tienne, c'est l'utilisation de empty qui ne me semble pas du tout approprié (regarde attentivement le manuel PHP à propos de cette fonction). Par contre, dans la version du chat de Gepeto (Figaro), tu peux voir l'utilisation de array_key_exists qui me semble plus pertinent.

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/11/2019, 15h59
  2. comparer deux dossier par le nom des fichiers
    Par nclsbiz dans le forum Windows 7
    Réponses: 3
    Dernier message: 25/11/2011, 11h09
  3. Comparer des données entre deux Array
    Par Louro999 dans le forum Ruby
    Réponses: 3
    Dernier message: 08/06/2011, 18h01
  4. Comparer deux array
    Par snyfir dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/02/2009, 06h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo