请用dlang语言实现laravel关于数组便捷操作的包IlluminateSupportArr;这个包主要有以下几个方法和单独函数很方便ArraccessibleArraddArrcollapseArrcrossJoinArrdivideArrdotArrexceptArrexistsArrfirstArrflattenArrforgetArrgetArrhasArrhasAnyArrisAss
由于dlang语言没有类似于laravel的Illuminate\Support\Arr包,因此需要自己编写相应的函数来实现这些方法。下面是一些函数的示例代码:
// 判断一个变量是否可以被访问 template accessible(T) { bool accessible(U)(U obj) { return is(typeof(obj[0])) == is(T); } }
// 向数组中添加一个元素 template add(T) { void add(U)(ref U[] arr, T value) { arr ~= value; } }
// 将多个数组合并成一个 T[] collapse(T)(T[][] arrays) { T[] result; foreach (arr; arrays) { result ~= arr; } return result; }
// 计算多个数组的笛卡尔积 T[][] crossJoin(T)(T[][] arrays) { if (arrays.length == 0) { return [[]]; } else { T[][] result; foreach (i, arr; arrays) { foreach (j, value; arr) { auto row = new T; row[i] = value; foreach (prod; crossJoin(arrays[i + 1 .. $])) { result ~= row ~ prod; } } } return result; } }
// 分割一个数组为两个数组 Tuple!(T[], T[]) divide(T)(T[] arr, size_t index) { return tuple(arr[0 .. index], arr[index .. $]); }
// 将多维数组转换为一维数组(键名使用“.”连接) T[] dot(T)(string separator, T[] arr) { T[] result; foreach (key, value; arr) { if (is(typeof(value)) == typeof(T[])) { foreach (subkey, subvalue; dot!(separator)(value)) { result[key ~ separator ~ subkey] = subvalue; } } else { result[key] = value; } } return result; }
// 从数组中删除指定键名的元素 T[] except(T)(T[] arr, string[] keys) { T[] result = arr.dup; foreach (key; keys) { result.remove(key); } return result; }
// 判断一个数组中是否存在指定的键名 bool exists(T)(T[] arr, string key) { return arr canFind key; }
// 获取数组的第一个元素 T first(T)(T[] arr) { return arr[0]; }
// 将多维数组转换为一维数组 T[] flatten(T)(T[] arr) { T[] result; foreach (value; arr) { if (is(typeof(value)) == typeof(T[])) { result ~= flatten!(T)(value); } else { result ~= value; } } return result; }
// 从数组中删除指定键名的元素 T[] forget(T)(T[] arr, string key) { arr.remove(key); return arr; }
// 获取数组中指定键名的元素 T get(T)(T[] arr, string key, T defaultVal = T.init) { return arr.get(key, defaultVal); }
// 判断数组中是否存在指定的键名 bool has(T)(T[] arr, string key) { return arr.canFind(key); }
// 判断数组中是否存在任意一个指定的键名 bool hasAny(T)(T[] arr, string[] keys) { foreach (key; keys) { if (arr.canFind(key)) { return true; } } return false; }
// 判断一个数组是否为关联数组 bool isAssoc(T)(T[] arr) { foreach (key, value; arr) { if (!is(typeof(key)) == typeof(int)) { return true; } } return false; }
// 判断一个数组是否为索引数组 bool isList(T)(T[] arr) { foreach (i, value; arr) { if (i != to!int(i)) { return false; } } return true; }
// 将数组中的元素按照指定的键名重新分组 T[string] keyBy(T)(T[] arr, string key) { T[string] result; foreach (value; arr) { result[value[key]] = value; } return result; }
// 获取数组的最后一个元素 T last(T)(T[] arr) { return arr[$ - 1]; }
// 从数组中获取指定键名的元素 T[] only(T)(T[] arr, string[] keys) { T[] result; foreach (key; keys) { if (arr.canFind(key)) { result ~= arr[key]; } } return result; }
// 从数组中获取指定键名的元素,并将其作为新数组的键名 T[string] pluck(T)(T[] arr, string key) { T[string] result; foreach (value; arr) { result[value[key]] = value; } return result; }
// 在数组的开头添加一个元素 void prepend(T)(ref T[] arr, T value) { arr = [value] ~ arr; }
// 从数组中删除指定键名的元素,并返回它的值 T pull(T)(ref T[] arr, string key) { auto value = arr[key]; arr.remove(key); return value; }
// 根据数组中的键值对生成一个查询字符串 string query(T)(T[string] arr) { string result; foreach (key, value; arr) { result ~= key ~ "=" ~ value ~ "&"; } return result[0 .. $ - 1]; }
// 从数组中随机返回一个元素 T random(T)(T[] arr) { import std.random : uniform; return arr[uniform(0, arr.length - 1)]; }
// 在数组中设置指定键名的元素值 void set(T)(ref T[] arr, string key, T value) { arr[key] = value; }
// 将数组中的元素随机打乱 void shuffle(T)(ref T[] arr) { import std.random : shuffle; shuffle(arr); }
// 对数组进行排序 void sort(T)(ref T[] arr) { arr.sort(); }
// 对数组进行递归排序 void sortRecursive(T)(ref T[] arr) { foreach (i, value; arr) { if (is(typeof(value)) == typeof(T[])) { sortRecursive!(T)(value); } } sort!(T)(arr); }
// 将数组中的元素转换为CSS类名(键名为类名,键值为布尔值) string toCssClasses(T)(T[string]bool arr) { string result; foreach (key, value; arr) { if (value) { result ~= key ~ " "; } } return result[0 .. $ - 1]; }
// 将多维数组中的键名使用“.”连接 T[string] undot(T)(T[] arr) { T[string] result; foreach (key, value; arr) { if (is(typeof(value)) == typeof(T[])) { foreach (subkey, subvalue; undot!(T)(value)) { result[key ~ "." ~ subkey] = subvalue; } } else { result[key] = value; } } return result; }
// 从数组中筛选出满足条件的元素 T[] where(T)(T[] arr, bool delegate(T) filter) { T[] result; foreach (value; arr) { if (filter(value)) { result ~= value; } } return result; }
// 从数组中筛选出不为null的元素 T[] whereNotNull(T)(T[] arr) { T[] result; foreach (value; arr) { if (!isNull(value)) { result ~= value; } } return result; }
// 将一个值转换为数组(如果它不是数组的话) T[] wrap(T)(T value) { if (is(typeof(value)) == typeof(T[])) { return value; } else { return [value]; } }
// 从数组中填充指定键名的元素 void dataFill(T)(ref T[] arr, string key, T value) { if (!arr.canFind(key)) { arr[key] = value; } }
// 从数组中获取指定键名的元素 T dataGet(T)(T[] arr, string key, T defaultVal = T.init) { return arr.get(key, defaultVal); }
// 在数组中设置指定键名的元素值 void dataSet(T)(ref T[] arr, string key, T value) { arr[key] = value; }
// 获取数组的第一个元素 T head(T)(T[] arr) { return arr[0]; }
// 获取数组的最后一个元素 T last(T)(T[] arr) { return arr[$ - 1]; }
这些函数只是示例代码,可能还需要根据具体情况进行修改和优化。同时,建议在实际使用中,对于一些复杂的操作,可以使用dlang的标准库或者其他第三方库中的相关函数来实现
原文地址: https://www.cveoy.top/t/topic/fnv6 著作权归作者所有。请勿转载和采集!