PHPR: Provide functional interfaces to manipulate arrays

Recommend this page to a friend!
  Info   Example   View files (21)   Download .zip   Reputation   Support forum   Blog (1)    
Ratings Unique User Downloads Download Rankings
77%Total: 180 All time: 8,503 This week: 378
Version License PHP version Categories
phpr 0.0.2GNU General Publi...5.3.0PHP 5, Data types
Description Author

This package provides functional interfaces to manipulate arrays.

It provides collection class that provide an array interface and uses two traits that have additional functions to provide a functional interface to manipulate arrays in a functional way similar to the Ruby language.

Currently the traits provide functions for accessing array elements and traverse the array, sort the array, check if the array contains a certain value, get the minimum and maximum value in the array, filter or map the array values using a callback function, etc..

Innovation Award
PHP Programming Innovation award nominee
December 2015
Number 7
Many classes require manipulating collections of elements. However the types of elements are different for each type of collection.

This package implements a trait for manipulating generic collections of elements that can be reused in classes for many different purposes.

Manuel Lemos
Picture of Eustaquio Rangel de Oliveira Jr.
  Performance   Level  
Name: Eustaquio Rangel de ... is available for providing paid consulting. Contact Eustaquio Rangel de ... .
Classes: 6 packages by
Country: Brazil Brazil
Age: 49
All time rank: 27821 in Brazil Brazil
Week rank: 259 11 in Brazil Brazil
Innovation award
Innovation award
Nominee: 3x

Winner: 1x

Details

PHPR

What is - motivation

Trying to extend some PHP objects to be used on a more functional way. Once one PHP developer said that nowadays IDE's can help us to avoid remembering the lack of standardization some PHP methods has. As I don't use an IDE, as lots of developers out there, I don't agree with that and I'm kind of tired to try to remember if on array_filter or array_map the array goes first and the function goes last or what order they are.

So, I think it's easier to use on a function and Ruby style way, where we can call the methods on the object and it returns what we need.

One notable exception to try to make things easier is that PHP have some reserved and constant words we cannot reuse even inside a namespace, like Array. So I needed to call the Array class Collection, otherwise it will be impossible to implement. All the classes have the original object accessible with the values method.

Other thing is that some methods just returns a value or null, true or false. No more guesses and wonderings of what happened if it returns 0 or false.

Samples

$t = new PHPR\Collection([0 => "zero", 1 => "one", 2 => "two"]);

// outputs: 
// null
// yay, no more 'undefined index' messages!
echo $t[10]."\n";

// outputs:
// zero
// one
// two
$t->each(function($e) {
   echo "$e\n";
});

// each
// outputs:
// 0 - zero
// 1 - one
// 2 - two
$t->each(function($key, $val) {
   echo "$key - $val\n";
});

$t->includes("one");    // true
$t->includes("three");  // false

// sort
// outputs:
// array(3) {
//   [0] =>
//   string(3) "one"
//   [1] =>
//   string(3) "two"
//   [2] =>
//   string(4) "zero"
// }
$sorted = $t->sort();
var_dump($sorted->values());

$t->min(); // "one"
$t->max(); // "zero"

// select
// outputs (keeping order):
// array(1) {
//   [0] =>
//   string(4) "zero"
// }
$selected = $t->select(function($e) {
   return strlen($e) > 3;
});
var_dump($selected->values());

// map
// outputs:
// array(3) {
//   [0] =>
//   string(4) "orez"
//   [1] =>
//   string(3) "eno"
//   [2] =>
//   string(3) "owt"
// }
$changed = $t->map(function($e) {
   return strrev($e);
});
var_dump($changed->values());

$t->all(function($e) { return strlen($e) > 2; })); // true
$t->all(function($e) { return strlen($e) > 3; })); // false

$t->any(function($e) { return strlen($e) > 3; })); // true
$t->any(function($e) { return strlen($e) > 4; })); // false

// chainable methods
// outputs:
// array(2) {
//     [0] =>
//     string(3) "eno"
//     [1] =>
//     string(3) "owt"
//   }
$changed = self::$_col->map(function($e) {
   return strrev($e);
})->select(function($e) { return strlen($e) <= 3; });
var_dump($changed->values());
  Files  
File Role Description
samples (1 file, 1 directory)
src (3 files)
test (1 file)
composer.json Data Auxiliary data
LICENSE.txt Lic. License
README.md Doc. Documentation

  Files  /  samples  
File Role Description
enumerable (13 files)
   collection.php Example Example script

  Files  /  samples  /  enumerable  
File Role Description
   all.php Example Example script
   any.php Example Example script
   each.php Example Example script
   find.php Example Example script
   group_by.php Example Example script
   includes.php Example Example script
   inject.php Example Example script
   map.php Example Example script
   minmax.php Example Example script
   partition.php Example Example script
   reject.php Example Example script
   select.php Example Example script
   sort.php Example Example script

  Files  /  src  
File Role Description
   ArrayAccessInterface.php Class Class source
   Collection.php Class Class source
   Enumerable.php Class Class source

  Files  /  test  
File Role Description
   enumerableTest.php Test Unit test script

 Version Control Unique User Downloads Download Rankings  
 100%
Total:180
This week:0
All time:8,503
This week:378
 User Ratings  
 
 All time
Utility:83%
Consistency:83%
Documentation:91%
Examples:91%
Tests:91%
Videos:-
Overall:77%
Rank:82
  

For more information send a message to info at phpclasses dot org.