ajout cl::split_assoc

This commit is contained in:
Jephté Clain 2025-09-15 22:51:20 +04:00
parent 96e046d5bf
commit 5652d38073

View File

@ -923,4 +923,48 @@ class cl {
A::usort($array, $keys, $assoc); A::usort($array, $keys, $assoc);
return $array; return $array;
} }
#############################################################################
/**
* Extraire d'un tableau les clés séquentielles et les clés associatives
*
* Retourner une liste [$list, $assoc] $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);
}
} }