Skip to content

Commit 4b6f0f6

Browse files
committed
feat: ajout des methodes diffRecursive et countRecursive a la classe Arr
1 parent 4838cb2 commit 4b6f0f6

1 file changed

Lines changed: 57 additions & 0 deletions

File tree

Iterable/Arr.php

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)