diff --git a/php/src/cl.php b/php/src/cl.php index f0919ea..b15ed55 100644 --- a/php/src/cl.php +++ b/php/src/cl.php @@ -923,4 +923,48 @@ class cl { A::usort($array, $keys, $assoc); return $array; } + + ############################################################################# + + /** + * Extraire d'un tableau les clés séquentielles et les clés associatives + * + * Retourner une liste [$list, $assoc] où $list est un tableau avec uniquement + * les valeurs des clés séquentielles et $assoc est un tableau avec uniquement + * les valeurs des clés associatives. S'il n'existe aucune clé séquentielle + * (resp. aucune clé associative), $list (resp. $assoc) vaut null. + * + * Par exemple: split_assoc(["a", "b" => "c"]) retourne [["a"], ["b" => "c"]] + */ + static final function split_assoc(?array $array): array { + $list = null; + $assoc = null; + if ($array !== null) { + $i = 0; + foreach ($array as $key => $value) { + if ($key === $i) { + $list[] = $value; + $i++; + } else { + $assoc[$key] = $value; + } + } + } + return [$list, $assoc]; + } + + /** + * Joindre en un seul tableau un tableau avec des clés séquentielles et un + * tableau avec des clés associatives. + * + * Si $list_first==true, les clés séquentielles arrivent d'abord, ensuite les + * clés associatives. Sinon, ce sont les clés associatives qui arrivent d'abord + */ + static final function merge_assoc(?array &$array, ?array $list, ?array $assoc, bool $list_first=false): void { + if ($list === null && $assoc === null) $array = []; + elseif ($list === null) $array = $assoc; + elseif ($assoc === null) $array = $list; + elseif ($list_first) $array = array_merge($list, $assoc); + else $array = array_merge($assoc, $list); + } }