@@ -1411,6 +1411,63 @@ public static function sortRecursive(array $array, int $options = SORT_REGULAR,
14111411 return $ array ;
14121412 }
14131413
1414+ /**
1415+ * Compare récursivement deux tableaux associatifs et renvoie la différence sous la forme d'un nouveau tableau.
1416+ * Retourne les clés qui existent dans `$original` mais pas dans `$compareWith`.
1417+ */
1418+ public static function diffRecursive (array $ original , array $ compareWith ): array
1419+ {
1420+ $ difference = [];
1421+
1422+ if ($ original === []) {
1423+ return [];
1424+ }
1425+
1426+ if ($ compareWith === []) {
1427+ return $ original ;
1428+ }
1429+
1430+ foreach ($ original as $ originalKey => $ originalValue ) {
1431+ if ($ originalValue === []) {
1432+ continue ;
1433+ }
1434+
1435+ if (is_array ($ originalValue )) {
1436+ $ diffArrays = [];
1437+
1438+ if (isset ($ compareWith [$ originalKey ]) && is_array ($ compareWith [$ originalKey ])) {
1439+ $ diffArrays = self ::diffRecursive ($ originalValue , $ compareWith [$ originalKey ]);
1440+ } else {
1441+ $ difference [$ originalKey ] = $ originalValue ;
1442+ }
1443+
1444+ if ($ diffArrays !== []) {
1445+ $ difference [$ originalKey ] = $ diffArrays ;
1446+ }
1447+ } elseif (is_string ($ originalValue ) && ! array_key_exists ($ originalKey , $ compareWith )) {
1448+ $ difference [$ originalKey ] = $ originalValue ;
1449+ }
1450+ }
1451+
1452+ return $ difference ;
1453+ }
1454+
1455+ /**
1456+ * Compte récursivement toutes les clés.
1457+ */
1458+ public static function countRecursive (array $ array , int $ counter = 0 ): int
1459+ {
1460+ foreach ($ array as $ value ) {
1461+ if (is_array ($ value )) {
1462+ $ counter = self ::countRecursive ($ value , $ counter );
1463+ }
1464+
1465+ $ counter ++;
1466+ }
1467+
1468+ return $ counter ;
1469+ }
1470+
14141471 /**
14151472 * Conditionally compile classes from an array into a CSS class list.
14161473 */
0 commit comments