| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030 |
- <?php
- namespace Illuminate\Tests\Support;
- use ArrayObject;
- use Illuminate\Support\Arr;
- use Illuminate\Support\Carbon;
- use Illuminate\Support\Collection;
- use InvalidArgumentException;
- use PHPUnit\Framework\TestCase;
- use stdClass;
- class SupportArrTest extends TestCase
- {
- public function testAccessible()
- {
- $this->assertTrue(Arr::accessible([]));
- $this->assertTrue(Arr::accessible([1, 2]));
- $this->assertTrue(Arr::accessible(['a' => 1, 'b' => 2]));
- $this->assertTrue(Arr::accessible(new Collection));
- $this->assertFalse(Arr::accessible(null));
- $this->assertFalse(Arr::accessible('abc'));
- $this->assertFalse(Arr::accessible(new stdClass));
- $this->assertFalse(Arr::accessible((object) ['a' => 1, 'b' => 2]));
- }
- public function testAdd()
- {
- $array = Arr::add(['name' => 'Desk'], 'price', 100);
- $this->assertEquals(['name' => 'Desk', 'price' => 100], $array);
- $this->assertEquals(['surname' => 'Mövsümov'], Arr::add([], 'surname', 'Mövsümov'));
- $this->assertEquals(['developer' => ['name' => 'Ferid']], Arr::add([], 'developer.name', 'Ferid'));
- }
- public function testCollapse()
- {
- $data = [['foo', 'bar'], ['baz']];
- $this->assertEquals(['foo', 'bar', 'baz'], Arr::collapse($data));
- $array = [[1], [2], [3], ['foo', 'bar'], collect(['baz', 'boom'])];
- $this->assertEquals([1, 2, 3, 'foo', 'bar', 'baz', 'boom'], Arr::collapse($array));
- }
- public function testCrossJoin()
- {
- // Single dimension
- $this->assertSame(
- [[1, 'a'], [1, 'b'], [1, 'c']],
- Arr::crossJoin([1], ['a', 'b', 'c'])
- );
- // Square matrix
- $this->assertSame(
- [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']],
- Arr::crossJoin([1, 2], ['a', 'b'])
- );
- // Rectangular matrix
- $this->assertSame(
- [[1, 'a'], [1, 'b'], [1, 'c'], [2, 'a'], [2, 'b'], [2, 'c']],
- Arr::crossJoin([1, 2], ['a', 'b', 'c'])
- );
- // 3D matrix
- $this->assertSame(
- [
- [1, 'a', 'I'], [1, 'a', 'II'], [1, 'a', 'III'],
- [1, 'b', 'I'], [1, 'b', 'II'], [1, 'b', 'III'],
- [2, 'a', 'I'], [2, 'a', 'II'], [2, 'a', 'III'],
- [2, 'b', 'I'], [2, 'b', 'II'], [2, 'b', 'III'],
- ],
- Arr::crossJoin([1, 2], ['a', 'b'], ['I', 'II', 'III'])
- );
- // With 1 empty dimension
- $this->assertEmpty(Arr::crossJoin([], ['a', 'b'], ['I', 'II', 'III']));
- $this->assertEmpty(Arr::crossJoin([1, 2], [], ['I', 'II', 'III']));
- $this->assertEmpty(Arr::crossJoin([1, 2], ['a', 'b'], []));
- // With empty arrays
- $this->assertEmpty(Arr::crossJoin([], [], []));
- $this->assertEmpty(Arr::crossJoin([], []));
- $this->assertEmpty(Arr::crossJoin([]));
- // Not really a proper usage, still, test for preserving BC
- $this->assertSame([[]], Arr::crossJoin());
- }
- public function testDivide()
- {
- [$keys, $values] = Arr::divide(['name' => 'Desk']);
- $this->assertEquals(['name'], $keys);
- $this->assertEquals(['Desk'], $values);
- }
- public function testDot()
- {
- $array = Arr::dot(['foo' => ['bar' => 'baz']]);
- $this->assertEquals(['foo.bar' => 'baz'], $array);
- $array = Arr::dot([]);
- $this->assertEquals([], $array);
- $array = Arr::dot(['foo' => []]);
- $this->assertEquals(['foo' => []], $array);
- $array = Arr::dot(['foo' => ['bar' => []]]);
- $this->assertEquals(['foo.bar' => []], $array);
- $array = Arr::dot(['name' => 'taylor', 'languages' => ['php' => true]]);
- $this->assertEquals(['name' => 'taylor', 'languages.php' => true], $array);
- }
- public function testUndot()
- {
- $array = Arr::undot([
- 'user.name' => 'Taylor',
- 'user.age' => 25,
- 'user.languages.0' => 'PHP',
- 'user.languages.1' => 'C#',
- ]);
- $this->assertEquals(['user' => ['name' => 'Taylor', 'age' => 25, 'languages' => ['PHP', 'C#']]], $array);
- $array = Arr::undot([
- 'pagination.previous' => '<<',
- 'pagination.next' => '>>',
- ]);
- $this->assertEquals(['pagination' => ['previous' => '<<', 'next' => '>>']], $array);
- $array = Arr::undot([
- 'foo',
- 'foo.bar' => 'baz',
- 'foo.baz' => ['a' => 'b'],
- ]);
- $this->assertEquals(['foo', 'foo' => ['bar' => 'baz', 'baz' => ['a' => 'b']]], $array);
- }
- public function testExcept()
- {
- $array = ['name' => 'taylor', 'age' => 26];
- $this->assertEquals(['age' => 26], Arr::except($array, ['name']));
- $this->assertEquals(['age' => 26], Arr::except($array, 'name'));
- $array = ['name' => 'taylor', 'framework' => ['language' => 'PHP', 'name' => 'Laravel']];
- $this->assertEquals(['name' => 'taylor'], Arr::except($array, 'framework'));
- $this->assertEquals(['name' => 'taylor', 'framework' => ['name' => 'Laravel']], Arr::except($array, 'framework.language'));
- $this->assertEquals(['framework' => ['language' => 'PHP']], Arr::except($array, ['name', 'framework.name']));
- }
- public function testExists()
- {
- $this->assertTrue(Arr::exists([1], 0));
- $this->assertTrue(Arr::exists([null], 0));
- $this->assertTrue(Arr::exists(['a' => 1], 'a'));
- $this->assertTrue(Arr::exists(['a' => null], 'a'));
- $this->assertTrue(Arr::exists(new Collection(['a' => null]), 'a'));
- $this->assertFalse(Arr::exists([1], 1));
- $this->assertFalse(Arr::exists([null], 1));
- $this->assertFalse(Arr::exists(['a' => 1], 0));
- $this->assertFalse(Arr::exists(new Collection(['a' => null]), 'b'));
- }
- public function testWhereNotNull()
- {
- $array = array_values(Arr::whereNotNull([null, 0, false, '', null, []]));
- $this->assertEquals([0, false, '', []], $array);
- }
- public function testFirst()
- {
- $array = [100, 200, 300];
- // Callback is null and array is empty
- $this->assertNull(Arr::first([], null));
- $this->assertSame('foo', Arr::first([], null, 'foo'));
- $this->assertSame('bar', Arr::first([], null, function () {
- return 'bar';
- }));
- // Callback is null and array is not empty
- $this->assertEquals(100, Arr::first($array));
- // Callback is not null and array is not empty
- $value = Arr::first($array, function ($value) {
- return $value >= 150;
- });
- $this->assertEquals(200, $value);
- // Callback is not null, array is not empty but no satisfied item
- $value2 = Arr::first($array, function ($value) {
- return $value > 300;
- });
- $value3 = Arr::first($array, function ($value) {
- return $value > 300;
- }, 'bar');
- $value4 = Arr::first($array, function ($value) {
- return $value > 300;
- }, function () {
- return 'baz';
- });
- $this->assertNull($value2);
- $this->assertSame('bar', $value3);
- $this->assertSame('baz', $value4);
- }
- public function testLast()
- {
- $array = [100, 200, 300];
- $last = Arr::last($array, function ($value) {
- return $value < 250;
- });
- $this->assertEquals(200, $last);
- $last = Arr::last($array, function ($value, $key) {
- return $key < 2;
- });
- $this->assertEquals(200, $last);
- $this->assertEquals(300, Arr::last($array));
- }
- public function testFlatten()
- {
- // Flat arrays are unaffected
- $array = ['#foo', '#bar', '#baz'];
- $this->assertEquals(['#foo', '#bar', '#baz'], Arr::flatten($array));
- // Nested arrays are flattened with existing flat items
- $array = [['#foo', '#bar'], '#baz'];
- $this->assertEquals(['#foo', '#bar', '#baz'], Arr::flatten($array));
- // Flattened array includes "null" items
- $array = [['#foo', null], '#baz', null];
- $this->assertEquals(['#foo', null, '#baz', null], Arr::flatten($array));
- // Sets of nested arrays are flattened
- $array = [['#foo', '#bar'], ['#baz']];
- $this->assertEquals(['#foo', '#bar', '#baz'], Arr::flatten($array));
- // Deeply nested arrays are flattened
- $array = [['#foo', ['#bar']], ['#baz']];
- $this->assertEquals(['#foo', '#bar', '#baz'], Arr::flatten($array));
- // Nested arrays are flattened alongside arrays
- $array = [new Collection(['#foo', '#bar']), ['#baz']];
- $this->assertEquals(['#foo', '#bar', '#baz'], Arr::flatten($array));
- // Nested arrays containing plain arrays are flattened
- $array = [new Collection(['#foo', ['#bar']]), ['#baz']];
- $this->assertEquals(['#foo', '#bar', '#baz'], Arr::flatten($array));
- // Nested arrays containing arrays are flattened
- $array = [['#foo', new Collection(['#bar'])], ['#baz']];
- $this->assertEquals(['#foo', '#bar', '#baz'], Arr::flatten($array));
- // Nested arrays containing arrays containing arrays are flattened
- $array = [['#foo', new Collection(['#bar', ['#zap']])], ['#baz']];
- $this->assertEquals(['#foo', '#bar', '#zap', '#baz'], Arr::flatten($array));
- }
- public function testFlattenWithDepth()
- {
- // No depth flattens recursively
- $array = [['#foo', ['#bar', ['#baz']]], '#zap'];
- $this->assertEquals(['#foo', '#bar', '#baz', '#zap'], Arr::flatten($array));
- // Specifying a depth only flattens to that depth
- $array = [['#foo', ['#bar', ['#baz']]], '#zap'];
- $this->assertEquals(['#foo', ['#bar', ['#baz']], '#zap'], Arr::flatten($array, 1));
- $array = [['#foo', ['#bar', ['#baz']]], '#zap'];
- $this->assertEquals(['#foo', '#bar', ['#baz'], '#zap'], Arr::flatten($array, 2));
- }
- public function testGet()
- {
- $array = ['products.desk' => ['price' => 100]];
- $this->assertEquals(['price' => 100], Arr::get($array, 'products.desk'));
- $array = ['products' => ['desk' => ['price' => 100]]];
- $value = Arr::get($array, 'products.desk');
- $this->assertEquals(['price' => 100], $value);
- // Test null array values
- $array = ['foo' => null, 'bar' => ['baz' => null]];
- $this->assertNull(Arr::get($array, 'foo', 'default'));
- $this->assertNull(Arr::get($array, 'bar.baz', 'default'));
- // Test direct ArrayAccess object
- $array = ['products' => ['desk' => ['price' => 100]]];
- $arrayAccessObject = new ArrayObject($array);
- $value = Arr::get($arrayAccessObject, 'products.desk');
- $this->assertEquals(['price' => 100], $value);
- // Test array containing ArrayAccess object
- $arrayAccessChild = new ArrayObject(['products' => ['desk' => ['price' => 100]]]);
- $array = ['child' => $arrayAccessChild];
- $value = Arr::get($array, 'child.products.desk');
- $this->assertEquals(['price' => 100], $value);
- // Test array containing multiple nested ArrayAccess objects
- $arrayAccessChild = new ArrayObject(['products' => ['desk' => ['price' => 100]]]);
- $arrayAccessParent = new ArrayObject(['child' => $arrayAccessChild]);
- $array = ['parent' => $arrayAccessParent];
- $value = Arr::get($array, 'parent.child.products.desk');
- $this->assertEquals(['price' => 100], $value);
- // Test missing ArrayAccess object field
- $arrayAccessChild = new ArrayObject(['products' => ['desk' => ['price' => 100]]]);
- $arrayAccessParent = new ArrayObject(['child' => $arrayAccessChild]);
- $array = ['parent' => $arrayAccessParent];
- $value = Arr::get($array, 'parent.child.desk');
- $this->assertNull($value);
- // Test missing ArrayAccess object field
- $arrayAccessObject = new ArrayObject(['products' => ['desk' => null]]);
- $array = ['parent' => $arrayAccessObject];
- $value = Arr::get($array, 'parent.products.desk.price');
- $this->assertNull($value);
- // Test null ArrayAccess object fields
- $array = new ArrayObject(['foo' => null, 'bar' => new ArrayObject(['baz' => null])]);
- $this->assertNull(Arr::get($array, 'foo', 'default'));
- $this->assertNull(Arr::get($array, 'bar.baz', 'default'));
- // Test null key returns the whole array
- $array = ['foo', 'bar'];
- $this->assertEquals($array, Arr::get($array, null));
- // Test $array not an array
- $this->assertSame('default', Arr::get(null, 'foo', 'default'));
- $this->assertSame('default', Arr::get(false, 'foo', 'default'));
- // Test $array not an array and key is null
- $this->assertSame('default', Arr::get(null, null, 'default'));
- // Test $array is empty and key is null
- $this->assertEmpty(Arr::get([], null));
- $this->assertEmpty(Arr::get([], null, 'default'));
- // Test numeric keys
- $array = [
- 'products' => [
- ['name' => 'desk'],
- ['name' => 'chair'],
- ],
- ];
- $this->assertSame('desk', Arr::get($array, 'products.0.name'));
- $this->assertSame('chair', Arr::get($array, 'products.1.name'));
- // Test return default value for non-existing key.
- $array = ['names' => ['developer' => 'taylor']];
- $this->assertSame('dayle', Arr::get($array, 'names.otherDeveloper', 'dayle'));
- $this->assertSame('dayle', Arr::get($array, 'names.otherDeveloper', function () {
- return 'dayle';
- }));
- }
- public function testHas()
- {
- $array = ['products.desk' => ['price' => 100]];
- $this->assertTrue(Arr::has($array, 'products.desk'));
- $array = ['products' => ['desk' => ['price' => 100]]];
- $this->assertTrue(Arr::has($array, 'products.desk'));
- $this->assertTrue(Arr::has($array, 'products.desk.price'));
- $this->assertFalse(Arr::has($array, 'products.foo'));
- $this->assertFalse(Arr::has($array, 'products.desk.foo'));
- $array = ['foo' => null, 'bar' => ['baz' => null]];
- $this->assertTrue(Arr::has($array, 'foo'));
- $this->assertTrue(Arr::has($array, 'bar.baz'));
- $array = new ArrayObject(['foo' => 10, 'bar' => new ArrayObject(['baz' => 10])]);
- $this->assertTrue(Arr::has($array, 'foo'));
- $this->assertTrue(Arr::has($array, 'bar'));
- $this->assertTrue(Arr::has($array, 'bar.baz'));
- $this->assertFalse(Arr::has($array, 'xxx'));
- $this->assertFalse(Arr::has($array, 'xxx.yyy'));
- $this->assertFalse(Arr::has($array, 'foo.xxx'));
- $this->assertFalse(Arr::has($array, 'bar.xxx'));
- $array = new ArrayObject(['foo' => null, 'bar' => new ArrayObject(['baz' => null])]);
- $this->assertTrue(Arr::has($array, 'foo'));
- $this->assertTrue(Arr::has($array, 'bar.baz'));
- $array = ['foo', 'bar'];
- $this->assertFalse(Arr::has($array, null));
- $this->assertFalse(Arr::has(null, 'foo'));
- $this->assertFalse(Arr::has(false, 'foo'));
- $this->assertFalse(Arr::has(null, null));
- $this->assertFalse(Arr::has([], null));
- $array = ['products' => ['desk' => ['price' => 100]]];
- $this->assertTrue(Arr::has($array, ['products.desk']));
- $this->assertTrue(Arr::has($array, ['products.desk', 'products.desk.price']));
- $this->assertTrue(Arr::has($array, ['products', 'products']));
- $this->assertFalse(Arr::has($array, ['foo']));
- $this->assertFalse(Arr::has($array, []));
- $this->assertFalse(Arr::has($array, ['products.desk', 'products.price']));
- $array = [
- 'products' => [
- ['name' => 'desk'],
- ],
- ];
- $this->assertTrue(Arr::has($array, 'products.0.name'));
- $this->assertFalse(Arr::has($array, 'products.0.price'));
- $this->assertFalse(Arr::has([], [null]));
- $this->assertFalse(Arr::has(null, [null]));
- $this->assertTrue(Arr::has(['' => 'some'], ''));
- $this->assertTrue(Arr::has(['' => 'some'], ['']));
- $this->assertFalse(Arr::has([''], ''));
- $this->assertFalse(Arr::has([], ''));
- $this->assertFalse(Arr::has([], ['']));
- }
- public function testHasAnyMethod()
- {
- $array = ['name' => 'Taylor', 'age' => '', 'city' => null];
- $this->assertTrue(Arr::hasAny($array, 'name'));
- $this->assertTrue(Arr::hasAny($array, 'age'));
- $this->assertTrue(Arr::hasAny($array, 'city'));
- $this->assertFalse(Arr::hasAny($array, 'foo'));
- $this->assertTrue(Arr::hasAny($array, 'name', 'email'));
- $this->assertTrue(Arr::hasAny($array, ['name', 'email']));
- $array = ['name' => 'Taylor', 'email' => 'foo'];
- $this->assertTrue(Arr::hasAny($array, 'name', 'email'));
- $this->assertFalse(Arr::hasAny($array, 'surname', 'password'));
- $this->assertFalse(Arr::hasAny($array, ['surname', 'password']));
- $array = ['foo' => ['bar' => null, 'baz' => '']];
- $this->assertTrue(Arr::hasAny($array, 'foo.bar'));
- $this->assertTrue(Arr::hasAny($array, 'foo.baz'));
- $this->assertFalse(Arr::hasAny($array, 'foo.bax'));
- $this->assertTrue(Arr::hasAny($array, ['foo.bax', 'foo.baz']));
- }
- public function testIsAssoc()
- {
- $this->assertTrue(Arr::isAssoc(['a' => 'a', 0 => 'b']));
- $this->assertTrue(Arr::isAssoc([1 => 'a', 0 => 'b']));
- $this->assertTrue(Arr::isAssoc([1 => 'a', 2 => 'b']));
- $this->assertFalse(Arr::isAssoc([0 => 'a', 1 => 'b']));
- $this->assertFalse(Arr::isAssoc(['a', 'b']));
- }
- public function testIsList()
- {
- $this->assertTrue(Arr::isList([]));
- $this->assertTrue(Arr::isList([1, 2, 3]));
- $this->assertTrue(Arr::isList(['foo', 2, 3]));
- $this->assertTrue(Arr::isList(['foo', 'bar']));
- $this->assertTrue(Arr::isList([0 => 'foo', 'bar']));
- $this->assertTrue(Arr::isList([0 => 'foo', 1 => 'bar']));
- $this->assertFalse(Arr::isList([1 => 'foo', 'bar']));
- $this->assertFalse(Arr::isList([1 => 'foo', 0 => 'bar']));
- $this->assertFalse(Arr::isList([0 => 'foo', 'bar' => 'baz']));
- $this->assertFalse(Arr::isList([0 => 'foo', 2 => 'bar']));
- $this->assertFalse(Arr::isList(['foo' => 'bar', 'baz' => 'qux']));
- }
- public function testOnly()
- {
- $array = ['name' => 'Desk', 'price' => 100, 'orders' => 10];
- $array = Arr::only($array, ['name', 'price']);
- $this->assertEquals(['name' => 'Desk', 'price' => 100], $array);
- $this->assertEmpty(Arr::only($array, ['nonExistingKey']));
- }
- public function testPluck()
- {
- $data = [
- 'post-1' => [
- 'comments' => [
- 'tags' => [
- '#foo', '#bar',
- ],
- ],
- ],
- 'post-2' => [
- 'comments' => [
- 'tags' => [
- '#baz',
- ],
- ],
- ],
- ];
- $this->assertEquals([
- 0 => [
- 'tags' => [
- '#foo', '#bar',
- ],
- ],
- 1 => [
- 'tags' => [
- '#baz',
- ],
- ],
- ], Arr::pluck($data, 'comments'));
- $this->assertEquals([['#foo', '#bar'], ['#baz']], Arr::pluck($data, 'comments.tags'));
- $this->assertEquals([null, null], Arr::pluck($data, 'foo'));
- $this->assertEquals([null, null], Arr::pluck($data, 'foo.bar'));
- $array = [
- ['developer' => ['name' => 'Taylor']],
- ['developer' => ['name' => 'Abigail']],
- ];
- $array = Arr::pluck($array, 'developer.name');
- $this->assertEquals(['Taylor', 'Abigail'], $array);
- }
- public function testPluckWithArrayValue()
- {
- $array = [
- ['developer' => ['name' => 'Taylor']],
- ['developer' => ['name' => 'Abigail']],
- ];
- $array = Arr::pluck($array, ['developer', 'name']);
- $this->assertEquals(['Taylor', 'Abigail'], $array);
- }
- public function testPluckWithKeys()
- {
- $array = [
- ['name' => 'Taylor', 'role' => 'developer'],
- ['name' => 'Abigail', 'role' => 'developer'],
- ];
- $test1 = Arr::pluck($array, 'role', 'name');
- $test2 = Arr::pluck($array, null, 'name');
- $this->assertEquals([
- 'Taylor' => 'developer',
- 'Abigail' => 'developer',
- ], $test1);
- $this->assertEquals([
- 'Taylor' => ['name' => 'Taylor', 'role' => 'developer'],
- 'Abigail' => ['name' => 'Abigail', 'role' => 'developer'],
- ], $test2);
- }
- public function testPluckWithCarbonKeys()
- {
- $array = [
- ['start' => new Carbon('2017-07-25 00:00:00'), 'end' => new Carbon('2017-07-30 00:00:00')],
- ];
- $array = Arr::pluck($array, 'end', 'start');
- $this->assertEquals(['2017-07-25 00:00:00' => '2017-07-30 00:00:00'], $array);
- }
- public function testArrayPluckWithArrayAndObjectValues()
- {
- $array = [(object) ['name' => 'taylor', 'email' => 'foo'], ['name' => 'dayle', 'email' => 'bar']];
- $this->assertEquals(['taylor', 'dayle'], Arr::pluck($array, 'name'));
- $this->assertEquals(['taylor' => 'foo', 'dayle' => 'bar'], Arr::pluck($array, 'email', 'name'));
- }
- public function testArrayPluckWithNestedKeys()
- {
- $array = [['user' => ['taylor', 'otwell']], ['user' => ['dayle', 'rees']]];
- $this->assertEquals(['taylor', 'dayle'], Arr::pluck($array, 'user.0'));
- $this->assertEquals(['taylor', 'dayle'], Arr::pluck($array, ['user', 0]));
- $this->assertEquals(['taylor' => 'otwell', 'dayle' => 'rees'], Arr::pluck($array, 'user.1', 'user.0'));
- $this->assertEquals(['taylor' => 'otwell', 'dayle' => 'rees'], Arr::pluck($array, ['user', 1], ['user', 0]));
- }
- public function testArrayPluckWithNestedArrays()
- {
- $array = [
- [
- 'account' => 'a',
- 'users' => [
- ['first' => 'taylor', 'last' => 'otwell', 'email' => 'taylorotwell@gmail.com'],
- ],
- ],
- [
- 'account' => 'b',
- 'users' => [
- ['first' => 'abigail', 'last' => 'otwell'],
- ['first' => 'dayle', 'last' => 'rees'],
- ],
- ],
- ];
- $this->assertEquals([['taylor'], ['abigail', 'dayle']], Arr::pluck($array, 'users.*.first'));
- $this->assertEquals(['a' => ['taylor'], 'b' => ['abigail', 'dayle']], Arr::pluck($array, 'users.*.first', 'account'));
- $this->assertEquals([['taylorotwell@gmail.com'], [null, null]], Arr::pluck($array, 'users.*.email'));
- }
- public function testPrepend()
- {
- $array = Arr::prepend(['one', 'two', 'three', 'four'], 'zero');
- $this->assertEquals(['zero', 'one', 'two', 'three', 'four'], $array);
- $array = Arr::prepend(['one' => 1, 'two' => 2], 0, 'zero');
- $this->assertEquals(['zero' => 0, 'one' => 1, 'two' => 2], $array);
- $array = Arr::prepend(['one' => 1, 'two' => 2], 0, null);
- $this->assertEquals([null => 0, 'one' => 1, 'two' => 2], $array);
- }
- public function testPull()
- {
- $array = ['name' => 'Desk', 'price' => 100];
- $name = Arr::pull($array, 'name');
- $this->assertSame('Desk', $name);
- $this->assertSame(['price' => 100], $array);
- // Only works on first level keys
- $array = ['joe@example.com' => 'Joe', 'jane@localhost' => 'Jane'];
- $name = Arr::pull($array, 'joe@example.com');
- $this->assertSame('Joe', $name);
- $this->assertSame(['jane@localhost' => 'Jane'], $array);
- // Does not work for nested keys
- $array = ['emails' => ['joe@example.com' => 'Joe', 'jane@localhost' => 'Jane']];
- $name = Arr::pull($array, 'emails.joe@example.com');
- $this->assertNull($name);
- $this->assertSame(['emails' => ['joe@example.com' => 'Joe', 'jane@localhost' => 'Jane']], $array);
- // Works with int keys
- $array = ['First', 'Second'];
- $first = Arr::pull($array, 0);
- $this->assertSame('First', $first);
- $this->assertSame([1 => 'Second'], $array);
- }
- public function testQuery()
- {
- $this->assertSame('', Arr::query([]));
- $this->assertSame('foo=bar', Arr::query(['foo' => 'bar']));
- $this->assertSame('foo=bar&bar=baz', Arr::query(['foo' => 'bar', 'bar' => 'baz']));
- $this->assertSame('foo=bar&bar=1', Arr::query(['foo' => 'bar', 'bar' => true]));
- $this->assertSame('foo=bar', Arr::query(['foo' => 'bar', 'bar' => null]));
- $this->assertSame('foo=bar&bar=', Arr::query(['foo' => 'bar', 'bar' => '']));
- }
- public function testRandom()
- {
- $random = Arr::random(['foo', 'bar', 'baz']);
- $this->assertContains($random, ['foo', 'bar', 'baz']);
- $random = Arr::random(['foo', 'bar', 'baz'], 0);
- $this->assertIsArray($random);
- $this->assertCount(0, $random);
- $random = Arr::random(['foo', 'bar', 'baz'], 1);
- $this->assertIsArray($random);
- $this->assertCount(1, $random);
- $this->assertContains($random[0], ['foo', 'bar', 'baz']);
- $random = Arr::random(['foo', 'bar', 'baz'], 2);
- $this->assertIsArray($random);
- $this->assertCount(2, $random);
- $this->assertContains($random[0], ['foo', 'bar', 'baz']);
- $this->assertContains($random[1], ['foo', 'bar', 'baz']);
- $random = Arr::random(['foo', 'bar', 'baz'], '0');
- $this->assertIsArray($random);
- $this->assertCount(0, $random);
- $random = Arr::random(['foo', 'bar', 'baz'], '1');
- $this->assertIsArray($random);
- $this->assertCount(1, $random);
- $this->assertContains($random[0], ['foo', 'bar', 'baz']);
- $random = Arr::random(['foo', 'bar', 'baz'], '2');
- $this->assertIsArray($random);
- $this->assertCount(2, $random);
- $this->assertContains($random[0], ['foo', 'bar', 'baz']);
- $this->assertContains($random[1], ['foo', 'bar', 'baz']);
- // preserve keys
- $random = Arr::random(['one' => 'foo', 'two' => 'bar', 'three' => 'baz'], 2, true);
- $this->assertIsArray($random);
- $this->assertCount(2, $random);
- $this->assertCount(2, array_intersect_assoc(['one' => 'foo', 'two' => 'bar', 'three' => 'baz'], $random));
- }
- public function testRandomOnEmptyArray()
- {
- $random = Arr::random([], 0);
- $this->assertIsArray($random);
- $this->assertCount(0, $random);
- $random = Arr::random([], '0');
- $this->assertIsArray($random);
- $this->assertCount(0, $random);
- }
- public function testRandomThrowsAnErrorWhenRequestingMoreItemsThanAreAvailable()
- {
- $exceptions = 0;
- try {
- Arr::random([]);
- } catch (InvalidArgumentException $e) {
- $exceptions++;
- }
- try {
- Arr::random([], 1);
- } catch (InvalidArgumentException $e) {
- $exceptions++;
- }
- try {
- Arr::random([], 2);
- } catch (InvalidArgumentException $e) {
- $exceptions++;
- }
- $this->assertSame(3, $exceptions);
- }
- public function testSet()
- {
- $array = ['products' => ['desk' => ['price' => 100]]];
- Arr::set($array, 'products.desk.price', 200);
- $this->assertEquals(['products' => ['desk' => ['price' => 200]]], $array);
- // No key is given
- $array = ['products' => ['desk' => ['price' => 100]]];
- Arr::set($array, null, ['price' => 300]);
- $this->assertSame(['price' => 300], $array);
- // The key doesn't exist at the depth
- $array = ['products' => 'desk'];
- Arr::set($array, 'products.desk.price', 200);
- $this->assertSame(['products' => ['desk' => ['price' => 200]]], $array);
- // No corresponding key exists
- $array = ['products'];
- Arr::set($array, 'products.desk.price', 200);
- $this->assertSame(['products', 'products' => ['desk' => ['price' => 200]]], $array);
- $array = ['products' => ['desk' => ['price' => 100]]];
- Arr::set($array, 'table', 500);
- $this->assertSame(['products' => ['desk' => ['price' => 100]], 'table' => 500], $array);
- $array = ['products' => ['desk' => ['price' => 100]]];
- Arr::set($array, 'table.price', 350);
- $this->assertSame(['products' => ['desk' => ['price' => 100]], 'table' => ['price' => 350]], $array);
- $array = [];
- Arr::set($array, 'products.desk.price', 200);
- $this->assertSame(['products' => ['desk' => ['price' => 200]]], $array);
- // Override
- $array = ['products' => 'table'];
- Arr::set($array, 'products.desk.price', 300);
- $this->assertSame(['products' => ['desk' => ['price' => 300]]], $array);
- }
- public function testShuffleWithSeed()
- {
- $this->assertEquals(
- Arr::shuffle(range(0, 100, 10), 1234),
- Arr::shuffle(range(0, 100, 10), 1234)
- );
- }
- public function testSort()
- {
- $unsorted = [
- ['name' => 'Desk'],
- ['name' => 'Chair'],
- ];
- $expected = [
- ['name' => 'Chair'],
- ['name' => 'Desk'],
- ];
- $sorted = array_values(Arr::sort($unsorted));
- $this->assertEquals($expected, $sorted);
- // sort with closure
- $sortedWithClosure = array_values(Arr::sort($unsorted, function ($value) {
- return $value['name'];
- }));
- $this->assertEquals($expected, $sortedWithClosure);
- // sort with dot notation
- $sortedWithDotNotation = array_values(Arr::sort($unsorted, 'name'));
- $this->assertEquals($expected, $sortedWithDotNotation);
- }
- public function testSortRecursive()
- {
- $array = [
- 'users' => [
- [
- // should sort associative arrays by keys
- 'name' => 'joe',
- 'mail' => 'joe@example.com',
- // should sort deeply nested arrays
- 'numbers' => [2, 1, 0],
- ],
- [
- 'name' => 'jane',
- 'age' => 25,
- ],
- ],
- 'repositories' => [
- // should use weird `sort()` behavior on arrays of arrays
- ['id' => 1],
- ['id' => 0],
- ],
- // should sort non-associative arrays by value
- 20 => [2, 1, 0],
- 30 => [
- // should sort non-incrementing numerical keys by keys
- 2 => 'a',
- 1 => 'b',
- 0 => 'c',
- ],
- ];
- $expect = [
- 20 => [0, 1, 2],
- 30 => [
- 0 => 'c',
- 1 => 'b',
- 2 => 'a',
- ],
- 'repositories' => [
- ['id' => 0],
- ['id' => 1],
- ],
- 'users' => [
- [
- 'age' => 25,
- 'name' => 'jane',
- ],
- [
- 'mail' => 'joe@example.com',
- 'name' => 'joe',
- 'numbers' => [0, 1, 2],
- ],
- ],
- ];
- $this->assertEquals($expect, Arr::sortRecursive($array));
- }
- public function testToCssClasses()
- {
- $classes = Arr::toCssClasses([
- 'font-bold',
- 'mt-4',
- ]);
- $this->assertEquals('font-bold mt-4', $classes);
- $classes = Arr::toCssClasses([
- 'font-bold',
- 'mt-4',
- 'ml-2' => true,
- 'mr-2' => false,
- ]);
- $this->assertEquals('font-bold mt-4 ml-2', $classes);
- }
- public function testWhere()
- {
- $array = [100, '200', 300, '400', 500];
- $array = Arr::where($array, function ($value, $key) {
- return is_string($value);
- });
- $this->assertEquals([1 => '200', 3 => '400'], $array);
- }
- public function testWhereKey()
- {
- $array = ['10' => 1, 'foo' => 3, 20 => 2];
- $array = Arr::where($array, function ($value, $key) {
- return is_numeric($key);
- });
- $this->assertEquals(['10' => 1, 20 => 2], $array);
- }
- public function testForget()
- {
- $array = ['products' => ['desk' => ['price' => 100]]];
- Arr::forget($array, null);
- $this->assertEquals(['products' => ['desk' => ['price' => 100]]], $array);
- $array = ['products' => ['desk' => ['price' => 100]]];
- Arr::forget($array, []);
- $this->assertEquals(['products' => ['desk' => ['price' => 100]]], $array);
- $array = ['products' => ['desk' => ['price' => 100]]];
- Arr::forget($array, 'products.desk');
- $this->assertEquals(['products' => []], $array);
- $array = ['products' => ['desk' => ['price' => 100]]];
- Arr::forget($array, 'products.desk.price');
- $this->assertEquals(['products' => ['desk' => []]], $array);
- $array = ['products' => ['desk' => ['price' => 100]]];
- Arr::forget($array, 'products.final.price');
- $this->assertEquals(['products' => ['desk' => ['price' => 100]]], $array);
- $array = ['shop' => ['cart' => [150 => 0]]];
- Arr::forget($array, 'shop.final.cart');
- $this->assertEquals(['shop' => ['cart' => [150 => 0]]], $array);
- $array = ['products' => ['desk' => ['price' => ['original' => 50, 'taxes' => 60]]]];
- Arr::forget($array, 'products.desk.price.taxes');
- $this->assertEquals(['products' => ['desk' => ['price' => ['original' => 50]]]], $array);
- $array = ['products' => ['desk' => ['price' => ['original' => 50, 'taxes' => 60]]]];
- Arr::forget($array, 'products.desk.final.taxes');
- $this->assertEquals(['products' => ['desk' => ['price' => ['original' => 50, 'taxes' => 60]]]], $array);
- $array = ['products' => ['desk' => ['price' => 50], null => 'something']];
- Arr::forget($array, ['products.amount.all', 'products.desk.price']);
- $this->assertEquals(['products' => ['desk' => [], null => 'something']], $array);
- // Only works on first level keys
- $array = ['joe@example.com' => 'Joe', 'jane@example.com' => 'Jane'];
- Arr::forget($array, 'joe@example.com');
- $this->assertEquals(['jane@example.com' => 'Jane'], $array);
- // Does not work for nested keys
- $array = ['emails' => ['joe@example.com' => ['name' => 'Joe'], 'jane@localhost' => ['name' => 'Jane']]];
- Arr::forget($array, ['emails.joe@example.com', 'emails.jane@localhost']);
- $this->assertEquals(['emails' => ['joe@example.com' => ['name' => 'Joe']]], $array);
- }
- public function testWrap()
- {
- $string = 'a';
- $array = ['a'];
- $object = new stdClass;
- $object->value = 'a';
- $this->assertEquals(['a'], Arr::wrap($string));
- $this->assertEquals($array, Arr::wrap($array));
- $this->assertEquals([$object], Arr::wrap($object));
- $this->assertEquals([], Arr::wrap(null));
- $this->assertEquals([null], Arr::wrap([null]));
- $this->assertEquals([null, null], Arr::wrap([null, null]));
- $this->assertEquals([''], Arr::wrap(''));
- $this->assertEquals([''], Arr::wrap(['']));
- $this->assertEquals([false], Arr::wrap(false));
- $this->assertEquals([false], Arr::wrap([false]));
- $this->assertEquals([0], Arr::wrap(0));
- $obj = new stdClass;
- $obj->value = 'a';
- $obj = unserialize(serialize($obj));
- $this->assertEquals([$obj], Arr::wrap($obj));
- $this->assertSame($obj, Arr::wrap($obj)[0]);
- }
- public function testSortByMany()
- {
- $unsorted = [
- ['name' => 'John', 'age' => 8, 'meta' => ['key' => 3]],
- ['name' => 'John', 'age' => 10, 'meta' => ['key' => 5]],
- ['name' => 'Dave', 'age' => 10, 'meta' => ['key' => 3]],
- ['name' => 'John', 'age' => 8, 'meta' => ['key' => 2]],
- ];
- // sort using keys
- $sorted = array_values(Arr::sort($unsorted, [
- 'name',
- 'age',
- 'meta.key',
- ]));
- $this->assertEquals([
- ['name' => 'Dave', 'age' => 10, 'meta' => ['key' => 3]],
- ['name' => 'John', 'age' => 8, 'meta' => ['key' => 2]],
- ['name' => 'John', 'age' => 8, 'meta' => ['key' => 3]],
- ['name' => 'John', 'age' => 10, 'meta' => ['key' => 5]],
- ], $sorted);
- // sort with order
- $sortedWithOrder = array_values(Arr::sort($unsorted, [
- 'name',
- ['age', false],
- ['meta.key', true],
- ]));
- $this->assertEquals([
- ['name' => 'Dave', 'age' => 10, 'meta' => ['key' => 3]],
- ['name' => 'John', 'age' => 10, 'meta' => ['key' => 5]],
- ['name' => 'John', 'age' => 8, 'meta' => ['key' => 2]],
- ['name' => 'John', 'age' => 8, 'meta' => ['key' => 3]],
- ], $sortedWithOrder);
- // sort using callable
- $sortedWithCallable = array_values(Arr::sort($unsorted, [
- function ($a, $b) {
- return $a['name'] <=> $b['name'];
- },
- function ($a, $b) {
- return $b['age'] <=> $a['age'];
- },
- ['meta.key', true],
- ]));
- $this->assertEquals([
- ['name' => 'Dave', 'age' => 10, 'meta' => ['key' => 3]],
- ['name' => 'John', 'age' => 10, 'meta' => ['key' => 5]],
- ['name' => 'John', 'age' => 8, 'meta' => ['key' => 2]],
- ['name' => 'John', 'age' => 8, 'meta' => ['key' => 3]],
- ], $sortedWithCallable);
- }
- }
|