From 9723c146d5c657c96123ad4d1963788847a1e61e Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 6 Mar 2025 12:31:00 +0400 Subject: [PATCH] ajout cl::same_keys() --- php/src/cl.php | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/php/src/cl.php b/php/src/cl.php index 8bb3b37..2397fe9 100644 --- a/php/src/cl.php +++ b/php/src/cl.php @@ -610,6 +610,42 @@ class cl { ############################################################################# + /** + * tester si $array a en début de tableau les mêmes clés que $ref, et dans le + * même ordre. $array peut avoir d'autres clés, ça n'influe pas sur le résultat + * + * $keys obtient la liste des clés de $ref trouvées, dans l'ordre de $array + * $remainKeys obtient la liste des clés de $array qui ne sont pas dans $ref + * $missingKeys obtient la liste des clés de $ref qui ne sont pas dans $array + */ + static function same_keys(?array $array, ?array $ref, ?array &$keys=null, ?array &$remainKeys=null, ?array &$missingKeys=null): bool { + $keys = []; + $remainKeys = []; + $missingKeys = []; + if ($array === null || $array === []) { + if ($ref === null || $ref === []) return true; + $missingKeys = array_keys($ref); + return false; + } elseif ($ref === null || $ref === []) { + $remainKeys = array_keys($array); + return true; + } + $refKeys = array_keys($ref); + $refCount = count($ref); + $index = 0; + $sameKeys = true; + foreach (array_keys($array) as $key) { + if ($index < $refCount) { + if ($key !== $refKeys[$index]) $sameKeys = false; + $index++; + } + if (array_key_exists($key, $ref)) $keys[] = $key; + else $remainKeys[] = $key; + } + $missingKeys = array_values(array_diff($refKeys, $keys)); + return $sameKeys && $index == $refCount; + } + /** * retourner le tableau $array en "renommant" les clés selon le tableau * $mappings qui contient des associations de la forme [$from => $to]