{"id":18772450,"url":"https://github.com/eftec/arrayone","last_synced_at":"2026-02-13T06:04:57.429Z","repository":{"id":148711684,"uuid":"619194853","full_name":"EFTEC/ArrayOne","owner":"EFTEC","description":"ArrayOne","archived":false,"fork":false,"pushed_at":"2024-12-31T18:14:20.000Z","size":123,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-27T00:12:11.992Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EFTEC.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-26T14:50:16.000Z","updated_at":"2024-12-31T18:13:48.000Z","dependencies_parsed_at":"2024-11-07T19:35:30.424Z","dependency_job_id":"951fce5e-dcf8-4818-bbc5-cf36259ce0ed","html_url":"https://github.com/EFTEC/ArrayOne","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EFTEC%2FArrayOne","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EFTEC%2FArrayOne/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EFTEC%2FArrayOne/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EFTEC%2FArrayOne/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EFTEC","download_url":"https://codeload.github.com/EFTEC/ArrayOne/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248683428,"owners_count":21144906,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-07T19:29:09.584Z","updated_at":"2026-02-13T06:04:57.394Z","avatar_url":"https://github.com/EFTEC.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ArrayOne\nIt is a minimalist library that process arrays in PHP with no dependency.\n\nThis library is focused to work with business data(reading/saving files, database records, API, etc.),\nso it is not similar to Numpy, Pandas, NumPHP or alike because they target difference objectives.\nIt is more closely similar to Microsoft PowerQuery and Linq.\nWhat it does? Filter, order, renaming column, grouping, validating, amongst many other operations.\n\n\n- [x] it works with PHP arrays. PHP arrays allows hierarchy structures using indexed and/or associative values.\n- [x] It is aimed at speed.\n- [x] It is minimalist, using the minimum of dependencies and only 1 PHP class.  Do you hate when a simple library adds a whole framework as dependency? Well, not here.\n- [x] It works using fluent/nested notations.\n- [x] Every method is documented using PhpDoc.\n\n[![Packagist](https://img.shields.io/packagist/v/eftec/ArrayOne.svg)](https://packagist.org/packages/eftec/ArrayOne)\n[![Total Downloads](https://poser.pugx.org/eftec/ArrayOne/downloads)](https://packagist.org/packages/eftec/ArrayOne)\n[![Maintenance](https://img.shields.io/maintenance/yes/2025.svg)]()\n[![composer](https://img.shields.io/badge/composer-%3E2.0-blue.svg)]()\n[![php](https://img.shields.io/badge/php-7.4-green.svg)]()\n[![php](https://img.shields.io/badge/php-8.4-green.svg)]()\n[![CocoaPods](https://img.shields.io/badge/docs-70%25-yellow.svg)]()\n\n\u003c!-- TOC --\u003e\n* [ArrayOne](#arrayone)\n  * [Basic examples](#basic-examples)\n  * [Getting started](#getting-started)\n  * [Concepts](#concepts)\n  * [Class ArrayOne](#class-arrayone)\n    * [Method __construct()](#method-__construct)\n      * [Parameters:](#parameters)\n    * [Method isIndexArray()](#method-isindexarray)\n      * [Parameters:](#parameters-1)\n    * [Method isIndexTableArray()](#method-isindextablearray)\n      * [Parameters:](#parameters-2)\n    * [Method makeRequestArrayByExample()](#method-makerequestarraybyexample)\n      * [Parameters:](#parameters-3)\n    * [Method makeValidateArrayByExample()](#method-makevalidatearraybyexample)\n      * [Parameters:](#parameters-4)\n    * [Method makeWalk()](#method-makewalk)\n      * [Parameters:](#parameters-5)\n    * [Method set()](#method-set)\n      * [Parameters:](#parameters-6)\n    * [Method setCsv()](#method-setcsv)\n      * [Parameters:](#parameters-7)\n    * [Method setCsvHeadLess()](#method-setcsvheadless)\n      * [Parameters:](#parameters-8)\n    * [Method setJson()](#method-setjson)\n      * [Parameters:](#parameters-9)\n    * [Method setRequest()](#method-setrequest)\n      * [Parameters:](#parameters-10)\n    * [Method aggr()](#method-aggr)\n      * [Parameters:](#parameters-11)\n    * [Method all()](#method-all)\n    * [Method avg()](#method-avg)\n      * [Parameters:](#parameters-12)\n    * [Method col()](#method-col)\n      * [Parameters:](#parameters-13)\n    * [Method colRename()](#method-colrename)\n      * [Parameters:](#parameters-14)\n    * [Method columnToIndex()](#method-columntoindex)\n      * [Parameters:](#parameters-15)\n    * [Method count()](#method-count)\n    * [Method filter()](#method-filter)\n      * [Parameters:](#parameters-16)\n    * [Method find()](#method-find)\n      * [Parameters:](#parameters-17)\n    * [Method first()](#method-first)\n    * [Method flat()](#method-flat)\n    * [Method getAll()](#method-getall)\n    * [Method getVersion()](#method-getversion)\n    * [Method group()](#method-group)\n      * [Parameters:](#parameters-18)\n    * [Method indexToCol()](#method-indextocol)\n      * [Parameters:](#parameters-19)\n    * [Method isIndex()](#method-isindex)\n    * [Method isIndexTable()](#method-isindextable)\n    * [Method isValid()](#method-isvalid)\n    * [Method join()](#method-join)\n      * [Parameters:](#parameters-20)\n    * [Method keepCol()](#method-keepcol)\n      * [Parameters:](#parameters-21)\n    * [Method last()](#method-last)\n    * [Method map()](#method-map)\n      * [Parameters:](#parameters-22)\n    * [Method mask()](#method-mask)\n      * [Parameters:](#parameters-23)\n    * [Method max()](#method-max)\n      * [Parameters:](#parameters-24)\n    * [Method min()](#method-min)\n      * [Parameters:](#parameters-25)\n    * [Method modCol()](#method-modcol)\n      * [Parameters:](#parameters-26)\n    * [Method nPos()](#method-npos)\n      * [Parameters:](#parameters-27)\n    * [Method offsetExists()](#method-offsetexists)\n    * [Method offsetGet()](#method-offsetget)\n      * [Parameters:](#parameters-28)\n    * [Method offsetSet()](#method-offsetset)\n      * [Parameters:](#parameters-29)\n    * [Method offsetUnset()](#method-offsetunset)\n      * [Parameters:](#parameters-30)\n    * [Method reduce()](#method-reduce)\n      * [Parameters:](#parameters-31)\n    * [Method removeCol()](#method-removecol)\n      * [Parameters:](#parameters-32)\n    * [Method removeDuplicate()](#method-removeduplicate)\n      * [Parameters:](#parameters-33)\n    * [Method removeFirstRow()](#method-removefirstrow)\n      * [Parameters:](#parameters-34)\n    * [Method removeLastRow()](#method-removelastrow)\n      * [Parameters:](#parameters-35)\n    * [Method removeRow()](#method-removerow)\n      * [Parameters:](#parameters-36)\n    * [Method rowToValue()](#method-rowtovalue)\n      * [Parameters:](#parameters-37)\n    * [Method shuffle()](#method-shuffle)\n    * [Method sort()](#method-sort)\n      * [Parameters:](#parameters-38)\n    * [Method splitColumn()](#method-splitcolumn)\n      * [Parameters:](#parameters-39)\n    * [Method sum()](#method-sum)\n      * [Parameters:](#parameters-40)\n    * [Method validate()](#method-validate)\n      * [Parameters:](#parameters-41)\n  * [versions](#versions)\n  * [License](#license)\n  \u003c!-- TOC --\u003e\n\n## Basic examples\n\n```php\n// Reducing an array using aggregate functions:\n$invoice=[\n    'id'=\u003e1,\n    'date'=\u003enew DateTime('now'),\n    'customer'=\u003e10,\n    'detail'=\u003e[\n        ['idproduct'=\u003e1,'unitPrice'=\u003e200,'quantity'=\u003e3],\n        ['idproduct'=\u003e2,'unitPrice'=\u003e300,'quantity'=\u003e4],\n        ['idproduct'=\u003e3,'unitPrice'=\u003e300,'quantity'=\u003e5],\n    ]\n];\n$arr=ArrayOne::set($invoice['detail'])\n    -\u003ereduce(['unitPrice'=\u003e'sum','quantity'=\u003e'sum'])\n    -\u003eall(); //['unitPrice'=\u003e800,'quanty'=\u003e12]\n// or also\n$arr=(new ArrayOne($invoice['detail']))\n    -\u003ereduce(['unitPrice'=\u003e'sum','quantity'=\u003e'sum'])\n    -\u003eall(); //['unitPrice'=\u003e800,'quanty'=\u003e12]\n```\n\n## Getting started\n\nFirst, you must install the library. You can download this library or use Composer for its installation:\n\n\u003e composer require eftec/arrayone\n\nOnce the library is installed and included, you can use as:\n\n```php\nuse eftec\\ArrayOne;\nArrayOne::set($array); // Initial operator: $array is our initial array.\n    -\u003esomeoperator1()  // Middle operator: here we do one or many operations to transform the array\n    -\u003esomeoperator2()\n    -\u003esomeoperator3()\n    -\u003eall(); // End operator: and we get the end result that usually is an array but it could be even a literal.\n```\n\n## Concepts\n\n```php\n$array=['hello'  // indexed field\n       'field2'=\u003e'world', // named field\n       'fields'=\u003e[   // a field with sub-fields\n           'alpha'=\u003e1,\n           'beta'=\u003e2\n       ],\n       'table'=\u003e[ // a field with a list of values (a table)\n           ['id'=\u003e1,'name'=\u003e'red'],\n           ['id'=\u003e2,'name'=\u003e'orange'],\n           ['id'=\u003e3,'name'=\u003e'blue'],           \n       ]\n   ];\n```\n\n* indexed and named fields works similarly.\n* Sometimes, some field contains an array of values that behave like a table (see **table** field)\n\n## Class ArrayOne\nClass ArrayOne\n\n\n### Method __construct()\nConstructor\u003cbr/\u003e\nYou can use (new ArrayOne($array))-\u003emethod() or use ArrayOne::set($array)-\u003emethod();\n#### Parameters:\n* **$array** param array|null $array (array|null)\n### Method isIndexArray()\nReturns true if the array is an indexed array. It does not scan the whole array, but instead it only returns\ntrue if the index 0 exists, and it is the first value.\u003cbr\u003e\n**Example:**\n```php\nArrayOne::isIndexArray(['cocacola','fanta']); // true\nArrayOne::isIndexArray(['prod1'=\u003e'cocacola','prod2'=\u003e'fanta']); // false (associative array)\nArrayOne::isIndexArray('cocacola'); // false (not array)\n```\n#### Parameters:\n* **$value** the value to analize. (mixed)\n### Method isIndexTableArray()\nIt returns true if the value is an indexed array with the first value an array (i.e. a table)\n**Example:**\n```php\nArrayOne::isIndexTableArray([['cocacola','fanta']]); // true\nArrayOne::isIndexTableArray(['cocacola','fanta']); // false\nArrayOne::isIndexTableArray(['first'=\u003e['hello'],'second'=\u003e'world']) // false\n```\n#### Parameters:\n* **$value** param mixed $value (mixed)\n### Method makeRequestArrayByExample()\nIt creates an associative array that could be used to be used by setRequest()\u003cbr/\u003e\n**Example:**\n```php\n$this-\u003emakeRequestArrayByExample(['a'=1,'b'=\u003e2]); // ['a'='post','b'=\u003e'post'];\n```\n#### Parameters:\n* **$array** An associative array with some values. (array)\n* **$type** =['get','post','request','header','cookie'][$i] The default type (string)\n### Method makeValidateArrayByExample()\nIt generates a validate-array using an example array. It could be used by validation() and filter()\u003cbr/\u003e\n**Example:**\n```php\n$this-\u003emakeValidateArrayByExample(['1','a','f'=\u003e3.3]); // ['int','string','f'=\u003e'float'];\n```\n#### Parameters:\n* **$array** param array $array (array)\n### Method makeWalk()\nWe call a method for every element of the array recursively.\u003cbr/\u003e\n**Example:**\n```php\nArrayOne::makeWalk(['a'=\u003e'hello','b'=\u003e['c'=\u003e'world'],function($row,$id) { return strotupper($row);});\n```\n#### Parameters:\n* **$array** Our initial array (array)\n* **$method** the method to call, example: function($row,$index) { return $row; } (callable)\n* **$identifyTable** (def: false) if we want the array identify inside arrays as table (bool)\n### Method set()\nIt sets the array to be transformed, and it starts the pipeline\u003cbr\u003e\nIt must be the first operator unless you are using the constructor.\n**Example:**\n```php\nArrayOne::set($array)-\u003eall();\nArrayOne::set($array,$object)-\u003eall(); // the object is used by validate()\nArrayOne::set($array,SomeClass:class)-\u003eall(); // the object is used by validate()\n```\n#### Parameters:\n* **$array** param array|null $array (array|null)\n* **$service** the service instance. You can use the class or an object. (object|null|string)\n### Method setCsv()\nIt sets the array using a csv. This csv must have a header.\u003cbr/\u003e\n**Example:**\n```php\nArrayOne::setCsv(\"a,b,c\\n1,2,3\\n4,5,6\")-\u003eall();\n```\n#### Parameters:\n* **$string** the string to parse (string)\n* **$separator** default \",\". Set the field delimiter (one character only). (string)\n* **$enclosure** default '\"'. Set the field enclosure character (one character only). (string)\n* **$escape** default \"\\\\\". Set the escape character (one character only). (string)\n### Method setCsvHeadLess()\nIt sets the array using a head-less csv.\u003cbr/\u003e\n**Example:**\n```php\nArrayOne::setCsvHeadLess(\"1,2,3\\n4,5,6\")-\u003eall();\nArrayOne::setCsvHeadLess(\"1,2,3\\n4,5,6\",['c1','c2','c3'])-\u003eall();\n```\n#### Parameters:\n* **$string** the string to parse (string)\n* **$header** If the header is null, then it creates an indexed array.\u003cbr/\u003e\n  if the header is an array, then it is used as header (array|null)\n* **$separator** default \",\". Set the field delimiter (one character only). (string)\n* **$enclosure** default '\"'. Set the field enclosure character (one character only). (string)\n* **$escape** default \"\\\\\". Set the escape character (one character only). (string)\n### Method setJson()\nIt sets the array using a json.\n**Example:**\n```php\nArrayOne::setJson('{\"a\":3,\"b\":[1,2,3]}')-\u003eall();\n```\n#### Parameters:\n* **$json** param string $json (string)\n### Method setRequest()\nIt sets the initial array readint the values from the request (get/post/header/etc.)\u003cbr/\u003e\n**Example:**\n```php\nArrayOne::setRequest([\n'id'=\u003e'get', // $_GET['id'] if not found then it uses the default value (null)\n'name'=\u003e'post|default', // $_POST['name'], if not found then it uses \"default\"\n'content'=\u003e'body' // it reads from the POST body\n],null); // null is the default value if not other default value is set.\n```\n#### Parameters:\n* **$fields** An associative array when the values to read 'id'=\u003e'type;defaultvalue'.\n  Types:\u003cbr/\u003e\n  \u003cb\u003eget\u003c/b\u003e: get it from the query string \u003cbr/\u003e\n  \u003cb\u003epost\u003c/b\u003e: get it from the post\u003cbr/\u003e\n  \u003cb\u003eheader\u003c/b\u003e: get if from the header\u003cbr/\u003e\n  \u003cb\u003erequest\u003c/b\u003e: get if from the post, otherwise from get\u003cbr/\u003e\n  \u003cb\u003ecookie\u003c/b\u003e: get if from the cookies\u003cbr/\u003e\n  \u003cb\u003ebody\u003c/b\u003e: get if from the post body (values are not serialized)\u003cbr/\u003e\n  \u003cb\u003everb\u003c/b\u003e: get if from the request method (GET/POST/PUT,etc.)\u003cbr/\u003e (array)\n* **$defaultValueAll** the default value if the value is not found and not other default value is set. (mixed)\n* **$separator** Def:'.', The separator character used when the field is nested.\u003cbr/\u003e\n  example using '.' as separator html:\u003cinput name='a.b' value=\"hello\" /\u003e\u003cbr/\u003e\n  result obtained:$result\\['a']\\['b']='hello'; (?string)\n### Method aggr()\nReturns the aggregates value of a column\u003cbr\u003e\n**Example:**\n```php\n$sum=$this-\u003eset($arr)-\u003eaggr('sum','col'); // returns sum of the column 'col'\n$min=$this-\u003eset($arr)-\u003eaggr('min','col'); // returns the min value of the column 'col'\n```\n#### Parameters:\n* **$type** =['max','min','avg','count','sum'][$i] (string)\n* **$colName** the column to aggregate (count does not require a column) (?mixed)\n* **$getKey** if false (default), it returns the value obtained. if true, it returns the key. (bool)\n### Method all()\nReturns the whole array transformed and not only the current navigation.\u003cbr/\u003e\n**Example:**\n```php\n$this-\u003eset($array)-\u003enav('field')-\u003eall();\n```\n### Method avg()\nReturns the average value of a specific column\u003cbr\u003e\n**Example:**\n```php\n$max=$this-\u003eset($arr)-\u003eavg('col'); // returns the average of the column 'col'\n```\n#### Parameters:\n* **$colName** the column (mixed)\n### Method col()\nReturns a single column as an array of values.\u003cbr/\u003e\n**Example:**\n```php\n$this-\u003ecol('c1'); // [['c1'=\u003e1,'c2'=\u003e2],['c1'=\u003e3,'c2'=\u003e4]] =\u003e [['c1'=\u003e1],['c1'=\u003e3]];\n```\n#### Parameters:\n* **$colName** the name of the column (mixed)\n### Method colRename()\nIt renames a column (or multiples columns) with a different name.\u003cbr\u003e\n**Example:**\n```php\n$this-\u003ecolRename('c1','n1'); // [['c1'=1,'c2'=\u003e2]] =\u003e [['n1'=\u003e1,'c2'=2]]\n$this-\u003ecolRename(['c1','c2'],['n1','n2']); // [['c1'=1,'c2'=\u003e2]] =\u003e [['n1'=\u003e1,'n2'=2]]\n```\n#### Parameters:\n* **$colName** the name of the column or columns (string|array)\n* **$newColName** the name of the column or columns (string|array)\n### Method columnToIndex()\nit converts a column into an index\u003cbr/\u003e\n**Example:**\n```php\n$this-\u003eindexToField('colold'); //  [['colold'=\u003e'a','col1'=\u003e'b','col2'=\u003e'c'] =\u003e ['a'=\u003e['col1'=\u003e'b','col2'=\u003e'c']]\n```\n#### Parameters:\n* **$oldColumn** the old column. This column will be converted into an index (mixed)\n### Method count()\nReturns the count of an array\u003cbr\u003e\n**Example:**\n```php\n$max=$this-\u003eset($arr)-\u003ecount(); // returns the count (number of elements)\n```\n### Method filter()\nIt filters the values. If the condition is false, then the row is deleted. It uses array_filter()\u003cbr/\u003e\nThe indexes are not rebuilt.\u003cbr\u003e\n**Example:**\n```php\n$array = [['id' =\u003e 1, 'name' =\u003e 'chile'], ['id' =\u003e 2, 'name' =\u003e 'argentina'], ['id' =\u003e 3, 'name' =\u003e 'peru']];\n// get the row #2 \"argentina\":\n// using a function:\n$r = ArrayOne::set($array)-\u003efilter(function($row, $id) {return $row['id'] === 2;}, true)-\u003eresult();\n$r = ArrayOne::set($array)-\u003efilter(fn($row, $id) =\u003e $row['id'] === 2, true)-\u003eresult();\n// using a function a returning a flat result:\n$r = ArrayOne::set($array)-\u003efilter(function($row, $id) {return $row['id'] === 2;}, false)-\u003eresult();\n// using an associative array:\n$r = ArrayOne::set($array)-\u003efilter(['id'=\u003e'eq;2'], false)-\u003eresult(); // 'eq;2' or simply '2'\n// using an associative array that contains an array:\n$r = ArrayOne::set($array)-\u003efilter(['id'=\u003e['eq',2]], false)-\u003eresult();\n// multiples conditions: id=2 and col=10\n$r = ArrayOne::set($array)-\u003efilter([['id'=\u003e'eq;2'],['col','eq;10]], false)-\u003eresult();\n```\n#### Parameters:\n* **$condition** you can use a callable function ($row,$id):true {}\u003cbr/\u003e\n  or a comparison array ['id'=\u003e'eq;2|lt;3'] \"|\" adds more comparisons\u003cbr\u003e\n  or a comparison array [['id=\u003e['eq',2]],['id'=\u003e['lt',3]]]\u003cbr\u003e (callable|null|array)\n* **$flat** param bool $flat (bool)\n### Method find()\nIt returns an array with the key and values of the elements that matches the condition.\u003cbr\u003e\n**Example:**\n```php\nArrayOne::set($array)-\u003efind(function($row, $id) {\nreturn $row['id'] === 2;\n})-\u003eall(); // [[0,\"apple\"],[3,\"pear\"]]\n```\n#### Parameters:\n* **$condition** you can use a callable function ($row,$id):bool {}\u003cbr/\u003e\n  or a comparison array ['id'=\u003e'eq;2|lt;3'] \"|\" adds more comparisons\u003cbr\u003e\n  or a comparison array [['id=\u003e['eq',2]],['id'=\u003e['lt',3]]]\u003cbr\u003e (callable|null|array)\n* **$onlyFirst** if true then it only returns the first value (bool)\n* **$mode** =['all','key','value'] // (default is all)\u003cbr\u003e\n  \u003cb\u003eall\u003c/b\u003e returns the key and the value obtained\u003cbr\u003e\n  \u003cb\u003ekey\u003c/b\u003e only returns the key\u003cbr\u003e\n  \u003cb\u003evalue\u003c/b\u003e only returns the value (string)\n### Method first()\nIt returns the first element of an array.\n### Method flat()\nIt flats the results. If the result is an array with a single row, then it returns the row without the array\u003cbr/\u003e\n**Example:**\n```php\n$this-\u003eflat(); // [['a'=\u003e1,'b'=\u003e2]] =\u003e ['a'=\u003e1,'b'=\u003e2]\n```\n### Method getAll()\nClone of a(). This method returns the whole array transformed and not only the current navigation.\u003cbr/\u003e\n**Example:**\n```php\n$this-\u003eset($array)-\u003enav('field')-\u003egetAll();\n```\n### Method getVersion()\nIt gets the current version of the library\n### Method group()\nIt groups one column and return its column grouped and values aggregated\u003cbr/\u003e\n**Example:**\n```php\n// group in the same column using a predefined function:\n$this-\u003egroup('type',['c1'=\u003e'sum','price'=\u003e'sum']); // ['type1'=\u003e['c1'=\u003e20,'price'=\u003e30]]\n// group in a different column using a predefined function:\n$this-\u003egroup('type',['newcol'=\u003e'sum(amount)','price'=\u003e'sum(price)']);\n// multiples columns (columns are jointed using $this-\u003eseparator)\n$this-\u003egroup(['col1,col2'],['col3'=\u003e'sum']);\n// group using an indexed index:\n$this-\u003egroup('type',['c1'=\u003e'sum','pri'=\u003e'sum','grp'=\u003e'group'],false); // [['c1'=\u003e20,'pri'=\u003e30,'grp'=\u003e'type1']]\n// group using a function:\n$this-\u003egroup('type',['c1'=\u003efunction($cumulate,$row) { return $cumulate+$row['c1'];}]);\n// group using two functions, one per every row and the other at the end:\n$this-\u003egroup('type',['c1'=\u003e[\nfunction($cumulate,$row) { return $cumulate+$row['c1'];},\nfunction($cumulate,$numrows) { return $cumulate/$numRows;}]); // obtain the average of c1\n```\n#### Parameters:\n* **$columnToGroup** the column (or columns) to group. (mixed)\n* **$funcAggreg** An associative array ['col-to-aggregate'=\u003e'aggregation']\u003cbr/\u003e\n  or ['new-col'=\u003e'aggregation(col-to-agregate)']\u003cbr/\u003e\n  or ['col-to-aggr'=\u003efunction($cumulate,$row) {}]\u003cbr/\u003e\n  or ['col-to-aggr'=\u003e[function($cumulate,$row){},function($cumulate,$numRows){}]\u003cbr/\u003e\n  \u003cb\u003estack\u003c/b\u003e: It stack the rows grouped by the column\u003cbr/\u003e\n  \u003cb\u003ecount\u003c/b\u003e: Count\u003cbr/\u003e\n  \u003cb\u003eavg\u003c/b\u003e: Average\u003cbr/\u003e\n  \u003cb\u003emin\u003c/b\u003e: Minimum\u003cbr/\u003e\n  \u003cb\u003emax\u003c/b\u003e: Maximum\u003cbr/\u003e\n  \u003cb\u003esum\u003c/b\u003e: Sum\u003cbr/\u003e\n  \u003cb\u003efirst\u003c/b\u003e: First\u003cbr/\u003e\n  \u003cb\u003elast\u003c/b\u003e: last\u003cbr/\u003e\n  \u003cb\u003egroup\u003c/b\u003e: The grouped value\u003cbr/\u003e\n  \u003cb\u003efunction:$cumulate\u003c/b\u003e: Is where the value will be accumulated,\n  initially is null\u003cbr/\u003e\n  \u003cb\u003efunction:$row\u003c/b\u003e: The current value of the row\u003cbr/\u003e (array)\n* **$useGroupIndex** (def true), if true, then the result will use the grouped value as index\u003cbr\u003e\n  if false, then the result will return the values as an indexed array. (bool)\n### Method indexToCol()\nIt converts the index into a column, and converts the array into an indexed array\u003cbr/\u003e\n**Example:**\n```php\n$this-\u003eindexToCol('colnew'); // ['a'=\u003e['col1'=\u003e'b','col2'=\u003e'c']] =\u003e [['colnew'=\u003e'a','col1'=\u003e'b','col2'=\u003e'c']\n```\n#### Parameters:\n* **$newColumn** the name of the new column (mixed)\n### Method isIndex()\nIt is the dynamic version of the method isIndexArray.\u003cbr\u003e\n### Method isIndexTable()\nThe dynamic version of the method isIndexTableArray()\n### Method isValid()\n\n### Method join()\nJoins the current array with another array\u003cbr/\u003e\nIf the columns of both arrays have the same name, then the current name is retained.\u003cbr/\u003e\n**Example:**\n```php\n$products=[['id'=\u003e1,'name'=\u003e'cocacola','idtype'=\u003e123]];\n$types=[['id'=\u003e123,'desc'=\u003e'it is the type #123']];\nArrayOne::set($products)-\u003ejoin($types,'idtype','id')-\u003eall()\n// [['id'=\u003e1,'prod'=\u003e'cocacola','idtype'=\u003e123,'desc'=\u003e'it is the type #123']] \"id\" is from product.\n```\n#### Parameters:\n* **$arrayToJoin** param array|null $arrayToJoin (array|null)\n* **$column1** the column of the current array (mixed)\n* **$column2** the column of the array to join. (mixed)\n### Method keepCol()\nIt keeps a column or columns and removes the rest of columns\u003cbr/\u003e\n**Example:**\n```php\n$this-\u003ekeepCol('col1');\n$this-\u003ekeepCol(['col1','col2']);\n```\n#### Parameters:\n* **$colName** The name of the column or columns (array) (mixed)\n### Method last()\nIt returns the last element of an array.\n### Method map()\nIt calls a function for every element of an array\u003cbr\u003e\n**Example:**\n```php\n$this-\u003emap(function($row) { return strtoupper($row); });\n$this-\u003emap(function($row,$index) {$row['col1']=$row['col2']*$row['col3']; return $row });\n$this-\u003emodCol('col1',function($row,$index) { return $row['col2']*$row['col3'];  }); // it does the same\n```\n#### Parameters:\n* **$condition** The function to call.\u003cbr\u003e\n  It must have an argument (the current row) and it must return a value (callable|null)\n### Method mask()\nIt masks the current array using another array.\u003cbr/\u003e\nMasking deletes all field that are not part of our mask\u003cbr/\u003e\nThe mask is smart to recognize a table, so it could mask multiples values by only specifying the first row.\u003cbr/\u003e\n**Example:**\n```php\n$array=['a'=\u003e1,'b'=\u003e2,'c'=\u003e3,'items'=\u003e[[a1'=\u003e1,'a2'=\u003e2,'a3'=3],[a1'=\u003e1,'a2'=\u003e2,'a3'=3]];\n$mask=['a'=\u003e1,'items'=\u003e[[a1'=\u003e1]]; // [[a1'=\u003e1]] masks an entire table\n$this-\u003emask($mask); // $array=['a'=\u003e1,'items'=\u003e[[a1'=\u003e1],[a1'=\u003e1]];\n```\n#### Parameters:\n* **$arrayMask** An associative array with the mask. The mask could contain any value. (array)\n### Method max()\nReturns the max of a specific column\u003cbr\u003e\n**Example:**\n```php\n$max=$this-\u003eset($arr)-\u003emax('col'); // returns the max value of the column 'col'\n$max=$this-\u003eset($arr)-\u003emax('col',true); // returns the key where is the max value\n```\n#### Parameters:\n* **$colName** the column (mixed)\n* **$getKey** param bool $getKey (bool)\n### Method min()\nReturns the min of a specific column\u003cbr\u003e\n**Example:**\n```php\n$max=$this-\u003eset($arr)-\u003emin('col'); // returns the min value of the column 'col'\n$max=$this-\u003eset($arr)-\u003emin('col',true); // returns the key where is the min value\n```\n#### Parameters:\n* **$colName** the column (mixed)\n* **$getKey** param bool $getKey (bool)\n\n### Method minRow()\nIt finds the minimum value of a specific column and returns one or many values\u003cbr\u003e\n**Example:**\n```\n$max=$this-\u003eset($arr)-\u003eminRow('col'); // returns the min row of the column 'col'\n$max=$this-\u003eset($arr)-\u003eminRow('col','all'); // returns min max values (rows)\n$max=$this-\u003eset($arr)-\u003eminRow('col','all',true); // returns min max values (indexes)\n```\n#### Parameters:\n* **$colName** the name of the column to find a value (mixed)\n* **$returnType** =['first','last','random','all'][$i] \u003cbr\u003e\n  * **first** returns the first min value\u003cbr\u003e\n  * **last** returns the last min value\u003cbr\u003e\n  * **random** if there are many min values, then it returns one randomly\u003cbr\u003e\n  * **all** returns all the values that have the min value (string)\n* **$getKey** (default is false) if it returns the keys(indexs). If false it returns the columns (bool)\n### Method maxRow()\nIt finds the minimum value of a specific column and returns one or many values\u003cbr\u003e\n**Example:**\n```\n$max=$this-\u003eset($arr)-\u003emaxRow('col'); // returns the max row of the column 'col'\n$max=$this-\u003eset($arr)-\u003emaxRow('col','all'); // returns all max values (rows)\n$max=$this-\u003eset($arr)-\u003emaxRow('col','all',true); // returns all max values (indexes)\n```\n#### Parameters:\n* **$colName** the name of the column to find a value (mixed)\n* **$returnType** =['first','last','random','all'][$i] \u003cbr\u003e\n  * **first** returns the first min value\u003cbr\u003e\n  * **last** returns the last min value\u003cbr\u003e\n  * **random** if there are many min values, then it returns one randomly\u003cbr\u003e\n  * **all** returns all the values that have the min value (string)\n* **$getKey** (default is false) if it returns the keys(indexs). If false it returns the columns (bool)\n\n### Method modCol()\nIt adds or modify a column.\n**Example:**\n```php\n$this-\u003emodCol('col1',function($row,$index) { return $row['col2']*$row['col3'];  });\n$this-\u003emap(function($row,$index) {$row['col1']=$row['col2']*$row['col3']; return $row }); // it does the same\n```\n#### Parameters:\n* **$colName** the name of the column. If null, then it uses the entire row (string|int|null)\n* **$operation** the operation to realize. (callable|null)\n### Method nPos()\nIt returns the n-position of an array.\n#### Parameters:\n* **$index** param $index ()\n### Method offsetExists()\n\n### Method offsetGet()\nIt gets a value of the array\u003cbr\u003e\n**Example:**\n```php\n$this-\u003eoffsetGet(1); // $this-\u003earray[1];\n```\n#### Parameters:\n* **$offset** (if null, then it used the entire array) (mixed|null)\n### Method offsetSet()\nIt sets the value of the array.\u003cbr\u003e\n**Example:**\n```php\n$this-\u003eoffsetSet(1,\"hello\"); // $this-\u003earray[1]=\"hello\";\n```\n#### Parameters:\n* **$offset** (if null, then it used the entire array) (mixed|null)\n* **$value** the value to set (mixed)\n### Method offsetUnset()\nIt deletes a row of the array.\u003cbr\u003e\n**Example:**\n```php\n$this-\u003eoffsetUnset(1); // unset($this-\u003earray[1]);\n```\n#### Parameters:\n* **$offset** (if null, then it used the entire array) (mixed|null)\n### Method reduce()\nYou can reduce (flat) an array using aggregations or a custom function.\n**Example:**\n```php\n$this-\u003ereduce(['col1'=\u003e'sum','col2'=\u003e'avg','col3'=\u003e'min','col4'=\u003e'max']);\n$this-\u003ereduce(function($row,$index,$prev) { return ['col1'=\u003e$row['col1']+$prev['col1]];  });\n```\n#### Parameters:\n* **$functionAggregation** An associative array where the index is the column and the value\n  is the function of aggregation\u003cbr/\u003e\n  A function using the syntax: function ($row,$index,$prev) where $prev\n  is the accumulator value (array|callable)\n### Method removeCol()\nIt removes a column or columns\u003cbr/\u003e\n**Example:**\n```php\n$this-\u003eremoveCol('col1');\n$this-\u003eremoveCol(['col1','col2']);\n```\n#### Parameters:\n* **$colName** The name of the column or columns (array) (mixed)\n### Method removeDuplicate()\nThis function removes duplicates of a table.\u003cbr/\u003e\n**Example:**\n```php\n$dup=$this-\u003eremoveDuplicate('col');\n$dup=$this-\u003eremoveDuplicate(['col1','col2']);\n```\n#### Parameters:\n* **$colName** the column (or columns) to use to remove duplicates. (array|string)\n### Method removeFirstRow()\nIt removes the first row or rows. Numeric index could be renumbered.\n**Example:**\n```php\n$this-\u003eremoveFirstRow(); // remove the first row\n$this-\u003eremoveFirstRow(3); // remove the first 3 rows\n```\n#### Parameters:\n* **$numberOfRows** The number of rows to delete, the default is 1 (the first row) (int)\n* **$renumber** if true then it renumber the list\u003cbr/\u003e\n  ex: if 1 is deleted then $renumber=true: \\[0=\u003e0,1=\u003e1,'x'=\u003e2] =\u003e \\[0=\u003e0,1=\u003e2]\u003cbr/\u003e\n  ex: if 1 is deleted then $renumber=false: \\[0=\u003e0,1=\u003e1,2=\u003e2] =\u003e \\[0=\u003e0,2=\u003e2]\u003cbr/\u003e (bool)\n### Method removeLastRow()\nIt removes the last row or rows\n**Example:**\n```php\n$this-\u003eremoveLastRow(3);\n```\n#### Parameters:\n* **$numberOfRows** the number of rows to delete (int)\n* **$renumber** if true then it renumber the list (since we are deleting the last value then\n  usually we don't need it\u003cbr/\u003e\n  ex: if 1 is deleted then $renumber=true: [0=\u003e0,1=\u003e1,2=\u003e2] =\u003e [0=\u003e0,1=\u003e2]\u003cbr/\u003e\n  ex: if 1 is deleted then $renumber=false: [0=\u003e0,1=\u003e1,2=\u003e2] =\u003e [0=\u003e0,2=\u003e2]\u003cbr/\u003e (bool)\n### Method removeRow()\nIt removes the row with the id $rowId. If the row does not exist, then it does nothing\n**Example:**\n```php\n$this-\u003eremoveRow(20);\n```\n#### Parameters:\n* **$rowId** The id of the row to delete (mixed)\n* **$renumber** if true then it renumber the list\u003cbr/\u003e\n  ex: if 1 is deleted then $renumber=true: [0=\u003e0,1=\u003e1,2=\u003e2] =\u003e [0=\u003e0,1=\u003e2]\u003cbr/\u003e\n  ex: if 1 is deleted then $renumber=false: [0=\u003e0,1=\u003e1,2=\u003e2] =\u003e [0=\u003e0,2=\u003e2]\u003cbr/\u003e (bool)\n### Method rowToValue()\nIt transforms a row of values into a single value. If a row does not contain a column then it returns null\n**Example:**\n```php\n$values=[['a'=\u003e1,'b'=\u003e2'],['a'=\u003e2,'b'=\u003e3'],['c'=\u003e4]];\n$this-\u003erowToValue('a'); // [1,2]\n$this-\u003erowToValue('a',true); // [1,2,null]\n```\n#### Parameters:\n* **$colName** The name of the column (mixed)\n* **$nullWhenNotFound** if true then it returns null when the column is not found in a row\u003cbr\u003e\n  otherwise, it skips the column (bool)\n### Method shuffle()\n\n### Method sort()\nSort an array using a column or columns\u003cbr/\u003e\n**Example:**\n```php\n$this-\u003esort('payment','desc'); // sort an array using the column paypent descending.\n$this-\u003esort(['payment','customer']); // sort both columns ascending.\n$this-\u003esort(); // it sorts the array ascending using the column\n$this-\u003esort(['payment','customer'],['asc','desc']); // sorth both columns, ascending and descending\n$this-\u003esort(['payment','customer'],'desc'); // it sorts both columns descending.\n```\n#### Parameters:\n* **$column** The column or columns to sort.\u003cbr\u003e\n  If column is null, then it sorts the row (instead of a column of the row) (mixed)\n* **$direction** =['asc','desc'][$i] ascending or descending.\u003cbr\u003e\n  By default is ascending. (mixed)\n### Method splitColumn()\nIt split a column in two or more columns using a separator\n#### Parameters:\n* **$colName** The column to split (string)\n* **$newCols** The name of the new columns (array)\n* **$separator** If null, then it uses the default separator ($this-\u003eseparator) (string|null)\n### Method sum()\nReturns the sum value of a specific column\u003cbr\u003e\n**Example:**\n```php\n$max=$this-\u003eset($arr)-\u003esum('col'); // returns the sum of the column 'col'\n```\n#### Parameters:\n* **$colName** the column (mixed)\n### Method validate()\nValidate the current array using a comparison table\u003cbr/\u003e\nIt returns an associative array with null in the fields without error, or other value if error.\n**Example:**\n```php\n$this-\u003eset($arr)\n-\u003evalidate([\n'id'=\u003e'int',\n'table'=\u003e[['col1'=\u003e'int','col2'=\u003e'string']],   // note the double [[ ]] to indicate a table of values\n'list'=\u003e[['int']]\n])\n-\u003eall();\n// example using custom function\n// 1) defining the service class.\nclass ServiceClass {\npublic function test($value,$compare=null,\u0026$msg=null): bool\n{\nreturn true;\n}\n}\n// 2.1) and setting the service class using the class\nValidateOne\n-\u003eset($array,ServiceClass:class)\n-\u003evalidate('field'=\u003e'fn:test') // or -\u003evalidate('field'=\u003e[['fn','test']])\n-\u003eall();\n// 2.2) or you could use an instance\n$obj=new ServiceClass();\nValidateOne\n-\u003eset($array,$obj)\n-\u003evalidate('field'=\u003e'fn:test') // or -\u003evalidate('field'=\u003e[['fn','test']])\n-\u003eall();\n```\n| condition        | description                                                                         | example work                               | example fail           | expression     |\n|------------------|-------------------------------------------------------------------------------------|--------------------------------------------|------------------------|----------------|\n| not\u003ccondition\u003e   | negates any comparison, excepting nullable and custom  functions. Example: \"notint\" | \"hello\"                                    | 20                     | notint         |\n| nullable         | the value CAN be a null. **If the value is null, then it ignores other              | validations**                              | null                   | nullable       |\n| f:\u003cnamefunction\u003e | It calls a custom function defined in the service class. See example                | \"hello\"                                    |                        | f:test         |\n| contain like     | if a text is contained in                                                           | \"helloworld\"                               | \"hello\"                | contain;world  |\n| alpha            | if the value is alphabetic                                                          | \"hello\"                                    | \"hello33\"              | alpha          |\n| alphanumunder    | if the value is alphanumeric or under-case                                          | \"hello_33\"                                 | \"hello!33\"             | alphanumunder  |\n| alphanum         | if the value is alphanumeric                                                        | \"hello33\"                                  | \"hello!33\"             | alphanum       |\n| text             | if the value is a text                                                              | \"hello\"                                    | true                   | text           |\n| regexp           | if the value match a regular expression. You can't use  comma in the regular        | expression.                                | \"abc123\"      \"xyz123\" | regexp;        |\n| email            | if the value is an email                                                            | [\"aaa@bbb.com\"](mailto:aaa@bbb.com)        | \"aaa.bbb.com\"          | email          |\n| url              | if the value is an url                                                              | [https://www.nic.cl] (https://www.nic.cl/) | \"aaaa\"                 | url            |\n| domain           | if the value is a domain                                                            | [www.nic.cl] (www.nic.cl)                  | \"…..\"                  | domain         |\n| minlen           | the value must have a minimum length                                                | \"hello\"                                    | \"h\"                    | minlen;3       |\n| maxlen           | the value must have a maximum lenght                                                | \"h\"                                        | \"hello\"                | maxlen;3       |\n| betweenlen       | if the value has a size between                                                     | \"hello\"                                    | \"h\"                    | betweenlen;4,5 |\n| exist            | if the value exists                                                                 | \"hi\"                                       | null                   | exist          |\n| missing          | if the value not exist                                                              | null                                       | \"hi\"                   | missing        |\n| req,required     | if the value is required                                                            | \"hi\"                                       | null                   | req,required   |\n| eq ==            | if the value is equals to                                                           | 1                                          | 0                      | eq;1           |\n| ne != \u003c\u003e         | if the value is not equals to                                                       | 1                                          | 0                      | ne;0           |\n| null             | The value MUST be null. It is different to nullable because nullable is a           | \"CAN\"                                      | null                   | null           |\n| empty            | if the value is empty                                                               | \"\"                                         | \"hello\"                | empty          |\n| lt               | if the value is less than                                                           | 1                                          | 10                     | lt;5           |\n| lte/le           | if the value is less or equals than                                                 | 1                                          | 10                     | lte;5          |\n| gt               | if the value is great than                                                          | 10                                         | 1                      | gt;5           |\n| gte/ge           | if the value is great or equals than                                                | 10                                         | 1                      | gte;5          |\n| between          | if the value is between                                                             | 5                                          | 0                      | between;4,5    |\n| true             | if the value is true or 1                                                           | true                                       | false                  | true           |\n| false            | if the value is false, or 0                                                         | false                                      | true                   | false          |\n| array            | if the value is an array                                                            | [1,2,3]                                    | 1                      | array          |\n| int              | if the value is an integer                                                          | 1                                          | \"hello\"                | int            |\n| string           | if the value is a string                                                            | \"hello\"                                    | true                   | string         |\n| float            | if the value is a float                                                             | 333.3                                      | \"hello\"                | float          |\n| object           | if the value is an object                                                           | new stdClass()                             | 1                      | object         |\n| in               | the value must be in a list                                                         |                                            |                        |                |\n\n#### Parameters:\n\n* **$comparisonTable** see table (array)\n* **$extraFieldError** if true and the current array has more values than comparison table, then\n  it returns an error. (bool)\n\n\n\n## versions\n* 2.7 2024-12-24\n  * [new] removeConsecutiveDuplicate() \n  * Compatible with PHP 8.4\n* 2.6.1 2024-09-28\n  * [fixed] \n    * In 2.6 and lower, many functions detected when the array is null to avoid to do the operation.\n    * In 2.6.1, many functions detects when the array is empty (including null) to avoid to do the operation. \n* 2.6 2024-09-26\n  * [new] minRow()\n  * [new] maxRow()\n* 2.5.1 2024-09-20\n  * [new] keepCol()\n  * [new] coolRename()\n  * [new] shuffle()\n  * [new] updated this file to contain all the definitions.\n* 2.4 2024-08-15\n  * [update] sort() now allow to group by multiples columns\n  * [fixed] group() fixed the value returned. If multiples columns are used then, the new grouping column could be split.\n  * [new] splitColumn() split a column in two or more columns.~~\n* 2.3 2024-08-10\n  * [new] sum(),min(),max(),avg(),count(),aggr() \n* 2.2 2024-08-06\n  * sort() now accepts multiple columns. \n* 2.1 2024-08-03\n  * removeDuplicate(),group() now accepts multiples columns.\n* 2.00 2024-03-10\n  * nav() and currentArray() are removed from 2.0. The library was optimized and streamlined, and those functions are redundant.      \n  **migration:** \n```php\n// before:\n$r=ArrayOne::set($array)-\u003enav('field')-\u003e...-\u003eall();\n// now:\n$r=ArrayOne::set($array['field'])-\u003e...-\u003eall();\n// before:\n$r=ArrayOne::set($array)-\u003enav('field')-\u003e...-\u003ecurrentArray();\n// now:\n$r=$array;\n$r['field']=ArrayOne::set($array['field'])-\u003e...-\u003eall();\n```\n\n* 1.12 2024-03-01\n  * Updating dependency to PHP 7.4. The extended support of PHP 7.2 ended 3 years ago.\n* 1.11 2024-03-01\n  * added method find()\n  * aedded method isIndexArray() and isIndexTableArray()\n  * now find() and filter() allows multiple conditions\n  * and find() and filter(), the condition \\['field'='eq;2'] could be written as \\['field','2']\n* 1.10 2024-02-24\n  * Added more doc for validate()\n  * Now validate also returns an array $this::$errorStack\n  * New method isValid() which returns true is validate has no error. Otherwise false.\n* 1.9 2023-11-13\n  * added rowToValue() \n* 1.8.3 2023-09-16 \n  * offsetGet() generates a warning in php 8.1 (fixed)\n  * current() is marked as deprecated (but it is still functional), use getCurrent()\n* 1.8.2 2023-09-16\n  * solved a psr-4 problem in composer.json\n* 1.8.1 2023-09-16\n  * change the PHPDOC comments, now it uses markdown instead of \"pre\" tag.\n  * Added ArrayAccess interface.\n* 1.8 2023-07-29\n  * [mod] group() allows to specify a custom function(s). \n* 1.7 2023-06-04\n  * [new] group() allows returning the grouped value. It also allows returning the values as an indexed array.\n* 1.6 2023-04-10\n  * [optimization] setCurrentArray() now is only used when nav() is called or when the value is returned.\n* 1.5 2023-04-07\n  * [new] filtercondition() now allow conditions as array. \n* 1.4 2023-04-05\n  * [fix] filtercondition() fixed a warning when the value is null.\n  * [new] group() now allow to stack elements\n  * [new] group() now allow to specify a new column\n* 1.3 2023-03-31\n  * validation now allow negation (\"not\" prefix). \n* 1.2 \n  * renamed method getValidateArrayByExample() to makeValidateArrayByExample()\n  * new method makeRequestArrayByExample()\n  * new method setRequest()\n  * rename method setCol() to modCol(). Methods that start with \"set\" are used to initialize the variable.\n* 1.1 2023-03-28\n  * method filter() now allow a comparison array and a callable function.\n  * new method getValidateArrayByExample()\n  * new method removeRow()\n  * new method removeFirstRow()\n  * new mehtod removeLastRow()\n  * new method setCsv()\n  * new method setJson()\n* 1.0 2023-03-26 first version\n\n\n## License\n\nCopyright Jorge Castro Castillo 2023-2024.\nLicensed under dual license: LGPL-3.0 and commercial license.\n\nIn short:\n- [x] Can I use in a close source application for free? Yes if you don't modify this library.\n- [x] If you modify it, then you must share the source code.\n- [x] If you want to modify privately, then you must buy a license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feftec%2Farrayone","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feftec%2Farrayone","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feftec%2Farrayone/lists"}