* * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ // CodeIgniter Array Helpers if (! function_exists('dot_array_search')) { /** * Searches an array through dot syntax. Supports * wildcard searches, like foo.*.bar * * @return mixed */ function dot_array_search(string $index, array $array) { // See https://regex101.com/r/44Ipql/1 $segments = preg_split( '/(? SORT_ASC, * 'position' => SORT_ASC, * 'name' => SORT_STRING, * ]); * * The '.' dot operator in the column name indicates a deeper array or * object level. In principle, any number of sublevels could be used, * as long as the level and column exist in every array element. * * For information on multi-level array sorting, refer to Example #3 here: * https://www.php.net/manual/de/function.array-multisort.php * * @param array $array the reference of the array to be sorted * @param array $sortColumns an associative array of columns to sort * after and their sorting flags */ function array_sort_by_multiple_keys(array &$array, array $sortColumns): bool { // Check if there really are columns to sort after if (empty($sortColumns) || empty($array)) { return false; } // Group sorting indexes and data $tempArray = []; foreach ($sortColumns as $key => $sortFlag) { // Get sorting values $carry = $array; // The '.' operator separates nested elements foreach (explode('.', $key) as $keySegment) { // Loop elements if they are objects if (is_object(reset($carry))) { // Extract the object attribute foreach ($carry as $index => $object) { $carry[$index] = $object->{$keySegment}; } continue; } // Extract the target column if elements are arrays $carry = array_column($carry, $keySegment); } // Store the collected sorting parameters $tempArray[] = $carry; $tempArray[] = $sortFlag; } // Append the array as reference $tempArray[] = &$array; // Pass sorting arrays and flags as an argument list. return array_multisort(...$tempArray); } } if (! function_exists('array_flatten_with_dots')) { /** * Flatten a multidimensional array using dots as separators. * * @param iterable $array The multi-dimensional array * @param string $id Something to initially prepend to the flattened keys * * @return array The flattened array */ function array_flatten_with_dots(iterable $array, string $id = ''): array { $flattened = []; foreach ($array as $key => $value) { $newKey = $id . $key; if (is_array($value)) { $flattened = array_merge($flattened, array_flatten_with_dots($value, $newKey . '.')); } else { $flattened[$newKey] = $value; } } return $flattened; } }