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:
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:
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:
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