Skip to content

A full-on PHP manipulation utility-belt that provides support for the usual functional. 📦

License

Notifications You must be signed in to change notification settings

YtoTech/bottomline

 
 

Repository files navigation

Bottomline logo

bottomline

Build Status PHP version

Table of Contents:

Requirements

; php.ini
extension=php_mbstring.dll

Introduction

bottomline is a PHP utility library, similar to Underscore/Lodash, that utilizes namespaces and dynamic autoloading to improve performance.


NOTE: bottomline is not currently in feature parity with Underscore/Lodash. Review the contributing section for more information.


Benchmarks

Installation

Install bottomline as described in the methods below:

via Composer and packagist

Packagist repo

Put the require statement in your composer.json file and run composer install:

{
    "require": {
        "maciejczyzewski/bottomline": "*"
    }
}

via File Include

Put the require statement in your code:

require 'bottomline/bottomline.php';

Usage

Arrays

__::append([1, 2, 3], 4);
// >> [1, 2, 3, 4]

Creates an array of elements split into groups the length of size. If an array can't be split evenly, the final chunk will be the remaining elements.

__::chunk([1, 2, 3, 4, 5], 3);
// >> [[1, 2, 3], [4, 5]]

Returns a copy of the array with falsy values removed.

__::compact([0, 1, false, 2, '', 3]);
// >> [1, 2, 3]

Creates a slice of array with n elements dropped from the beginning.

__::drop([1, 2, 3], 2);
// >> [3]

Flattens a multidimensional array. If you pass shallow, the array will only be flattened a single level.

__::flatten([1, 2, [3, [4]]], true);
// >> [1, 2, 3, 4]

Patches array with list of xpath-value pairs.

__::patch(['addr' => ['country' => 'US', 'zip' => 12345]], ['/addr/country' => 'CA', '/addr/zip' => 54321]);
// >> ['addr' => ['country' => 'CA', 'zip' => 54321]]
__::prepend([1, 2, 3], 4);
// >> [4, 1, 2, 3]

Returns shuffled array ensuring no item remains in the same position.

__::randomize(1, 2, 3, 4);
// >> [4, 3, 1, 2]

Returns an array of integers from start to stop (exclusive) by step.

__::range(1, 10, 2);
// >> [1, 3, 5, 7, 9]
__::repeat('foo', 3);
// >> ['foo', 'foo', 'foo']

Sequences

__::chain([1, 2, 3, 0, null])
    ->compact()
    ->prepend(4)
    ->reduce(function($sum, $number) {
        return $sum + $number;
    }, 0)
    ->value();
// >> 10

Collections

Combines and merge collections provided with each others. If the collections have common keys, then the last passed keys override the previous. If numerical indexes are passed, then last passed indexes override the previous.

For a recursive merge, see __::merge.

__::assign(['color' => ['favorite' => 'red', 5], 3], [10, 'color' => ['favorite' => 'green', 'blue']]);
// >> ['color' => ['favorite' => 'green', 'blue'], 10]

Combines and concat collections provided with each others. If the collections have common keys, then the values are appended in an array. If numerical indexes are passed, then values are appended.

For a recursive concat, see __::concatDeep.

__::concat(['color' => ['favorite' => 'red', 5], 3], [10, 'color' => ['favorite' => 'green', 'blue']]);
// >> ['color' => ['favorite' => ['green'], 5, 'blue'], 3, 10]

Recursively combines and concat collections provided with each others. If the collections have common keys, then the values are appended in an array. If numerical indexes are passed, then values are appended.

For a non-recursive concat, see __::concat.

__::concatDeep(['color' => ['favorite' => 'red', 5], 3], [10, 'color' => ['favorite' => 'green', 'blue']]);
// >> ['color' => ['favorite' => ['red', 'green'], 5, 'blue'], 3, 10]

Flattens a complex collection by mapping each ending leafs value to a key consisting of all previous indexes.

__::ease(['foo' => ['bar' => 'ter'], 'baz' => ['b', 'z']]);
// >> '['foo.bar' => 'ter', 'baz.0' => 'b', , 'baz.1' => 'z']'

Returns the values in the collection that pass the truth test.

$a = [
    ['name' => 'fred',   'age' => 32],
    ['name' => 'maciej', 'age' => 16]
];

__::filter($a, function($n) {
    return $n['age'] > 24;
});
// >> [['name' => 'fred', 'age' => 32]]

Gets the first element of an array. Passing n returns the first n elements.

__::first([1, 2, 3, 4, 5], 2);
// >> [1, 2]

Iterate over elements of the collection and invokes iteratee for each element.

__::doForEach(
    [1, 2, 3],
    function ($n) {
        print_r($n)
    }
);
// (Side effect: print numbers)
// >> 1, 2, 3

Iterate over elements of the collection, from right to left, and invokes iteratee for each element.

__::doForEachRight(
    [1, 2, 3],
    function ($n) {
        print_r($n)
    }
);
// (Side effect: print numbers)
// >> 3, 2, 1

Checks if predicate returns truthy for all elements of collection.

__::every([true, 1, null, 'yes'], function ($v) { return is_bool($v); })
// >> false
__::every([true, false], function ($v) { return is_bool($v); })
// >> true

Get item of an array by index, aceepting nested index

__::get(['foo' => ['bar' => 'ter']], 'foo.bar');
// >> 'ter'

Group an array of objects or arrays based on a given key, accepting a nested index (same as __::get())

$a = [
    ['name' => 'maciej',    'continent' => 'Europe'],
    ['name' => 'yoan',      'continent' => 'Europe'],
    ['name' => 'brandtley', 'continent' => 'North America'],
];

__::groupBy($a, 'continent');
// >> [
//   'Europe' => [
//     ['name' => 'maciej', 'continent' => 'Europe'],
//     ['name' => 'yoan', 'continent' => 'Europe'],
//   ],
//   'North America' => [ ['name' => 'brandtley', 'continent' => 'North America'] ]
// ]

Returns true if the collection contains the requested key.

__::has(['foo' => ['bar' => 'num'], 'foz' => 'baz'], 'foo.bar');
// >> true

Returns if $input contains all requested $keys. If $strict is true it also checks if $input exclusively contains the given $keys.

__::hasKeys(['foo' => 'bar', 'foz' => 'baz'], ['foo', 'foz']);
// >> true

Check if value is an empty array or object.

__::isEmpty([]);
// >> true
__::isEmpty(new stdClass());
// >> true

Gets the last element of an array. Passing n returns the last n elements.

__::last([1, 2, 3, 4, 5], 2);
// >> [4, 5]

Returns an array of values by mapping each in collection through the iterator.

__::map([1, 2, 3], function($n) {
    return $n * 3;
});
// >> [3, 6, 9]

Transforms the keys in a collection by running each key through the iterator

__::mapKeys(['x' => 1], function($key, $value, $collection) {
    return "{$key}_{$value}";
});
// >> ['x_1' => 1]

__::mapKeys(['x' => 1], function($key) {
    return strtoupper($key);
});
// >> ['X' => 3]

__::mapKeys(['x' => 1])
// >> ['x' => 1]

Transforms the values in a collection by running each value through the iterator

__::mapValues(['x' => 1], function($value, $key, $collection) {
    return "{$key}_{$value}";
});
// >> ['x' => 'x_1']

__::mapValues(['x' => 1], function($value) {
    return $value * 3;
});
// >> ['x' => 3]

__::mapValues(['x' => 1])
// >> ['x' => 1]

Returns the maximum value from the collection. If passed an iterator, max will return max value returned by the iterator.

__::max([1, 2, 3]);
// >> 3

Recursively combines and merge collections provided with each others. If the collections have common keys, then the last passed keys override the previous. If numerical indexes are passed, then last passed indexes override the previous.

For a non-recursive merge, see __::assign.

__::merge(['color' => ['favorite' => 'red', 'model' => 3, 5], 3], [10, 'color' => ['favorite' => 'green', 'blue']]);
// >> ['color' => ['favorite' => 'green', 'model' => 3, 'blue'], 10]

Returns the minimum value from the collection. If passed an iterator, min will return min value returned by the iterator.

__::min([1, 2, 3]);
// >> 1

Returns an array of values belonging to a given property of each item in a collection.

$a = [
    ['foo' => 'bar',  'bis' => 'ter' ],
    ['foo' => 'bar2', 'bis' => 'ter2'],
];

__::pluck($a, 'foo');
// >> ['bar', 'bar2']

Reduces a collection to a value which is the accumulator result of running each element in the collection thru an iteratee function, where each successive invocation is supplied the return value of the previous.

__::reduce([1, 2], function ($sum, $number) {
    return $sum + $number;
}, 0);
// >> 3

Reduces a collection to a value which is the accumulator result of running each element in the collection - from right to left - thru an iteratee function, where each successive invocation is supplied the return value of the previous.

__::reduceRight(['a', 'b', 'c'], function ($word, $char) {
    return $word . $char;
}, '');
// >> 'cba'

Return a new collection with the item set at index to given value. Index can be a path.

__::set(['foo' => ['bar' => 'ter']], 'foo.baz.ber', 'fer');
// >> ['foo' => ['bar' => 'ter', 'baz' => ['ber' => 'fer']]]

Returns an array having only keys present in the given path list.

__::pick(['a' => 1, 'b' => ['c' => 3, 'd' => 4]], ['a', 'b.d']);
// → ['a' => 1, 'b' => ['d' => 4]]

Builds a multidimensional collection out of a hash map using the key as indicator where to put the value.

__::unease(['foo.bar' => 'ter', 'baz.0' => 'b', , 'baz.1' => 'z']);
// >> ['foo' => ['bar' => 'ter'], 'baz' => ['b', 'z']]
$a = [
    ['name' => 'fred',   'age' => 32],
    ['name' => 'maciej', 'age' => 16]
];

__::where($a, ['age' => 16]);
// >> [['name' => 'maciej', 'age' => 16]]

Functions

__::slug('Jakieś zdanie z dużą ilością obcych znaków!');
// >> 'jakies-zdanie-z-duza-iloscia-obcych-znakow'
$string = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque et mi orci.';
__::truncate($string);
// >> 'Lorem ipsum dolor sit amet, ...'
__::urlify('I love https://google.com');
// >> 'I love <a href="https://google.com">google.com</a>'

Objects

__::isArray([1, 2, 3]);
// >> true
__::isEmail('test@test.com');
// >> true
__::isFunction(function ($a) { return $a + 2; });
// >> true
__::isNull(null);
// >> true
__::isNumber(123);
// >> true
__::isObject('fred');
// >> false
__::isString('fred');
// >> true

Returns true if the argument is a collection (that is an array or object).

__::isCollection([1, 2, 3]);
// >> true

Utilities

Returns the first argument it receives

__::identity(1, 2, 3, 4)
// >> 1

__::identity()
// >> null

Strings

__::camelCase('Foo Bar');
// >> 'fooBar'
__::capitalize('FRED');
// >> 'Fred'
__::kebabCase('Foo Bar');
// >> 'foo-bar'
__::lowerCase('fooBar');
// >> 'foo bar'
__::lowerFirst('Fred');
// >> 'fred'
__::snakeCase('Foo Bar');
// >> 'foo_bar'

Split a string by string.

__::split('github.com', '.');
// >> ['github', 'com']
__::startCase('fooBar');
// >> 'Foo Bar'
__::toLower('fooBar');
// >> 'foobar'
__::toUpper('fooBar');
// >> 'FOOBAR'
__::upperCase('fooBar');
// >> 'FOO BAR'
__::upperFirst('fred');
// >> 'Fred'
__::words('fred, barney, & pebbles');
// >> ['fred', 'barney', 'pebbles']

Contributing

Please feel free to contribute to this project! Pull requests and feature requests welcome! ✌️

To run the tests, install PHPUnit with make install-dev and run the tests with make test.

License

See LICENSE file in this repository.

Thanks

About

A full-on PHP manipulation utility-belt that provides support for the usual functional. 📦

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • PHP 99.5%
  • Other 0.5%