Skip to content

Commit d9a0e25

Browse files
committed
Initial commit, ported methods from Fetch! CMS
1 parent 547b592 commit d9a0e25

File tree

5 files changed

+202
-0
lines changed

5 files changed

+202
-0
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/vendor
2+
/test/coverage
3+
/composer.lock

composer.json

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"name": "fetch/array-utils",
3+
"description": "Array utility methods, inspired by Ruby's array methods",
4+
"keywords": ["array", "utils"],
5+
"homepage": "https://github.com/fetch/php-array-utils",
6+
"license": "MIT",
7+
"authors": [
8+
{
9+
"name": "Koen Punt",
10+
"email": "koen@fetch.nl",
11+
"homepage": "https://github.com/koenpunt"
12+
}
13+
],
14+
"require-dev": {
15+
"phpunit/phpunit": "~4.5"
16+
},
17+
"autoload": {
18+
"files": ["lib/array.php"]
19+
}
20+
}

lib/array.php

+111
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
<?php
2+
3+
namespace {
4+
5+
if(!function_exists('array_delete')){
6+
7+
/**
8+
* Deletes entry from array and return its value
9+
*
10+
* @param array $data
11+
* @param string $key
12+
* @return mixed
13+
*/
14+
function array_delete(array &$data, $key){
15+
if(array_key_exists($key, $data)){
16+
$value = $data[$key];
17+
unset($data[$key]);
18+
return $value;
19+
}
20+
}
21+
22+
}
23+
24+
if(!function_exists('array_get')){
25+
26+
/**
27+
* Lookup entry in array and return value, returns false if not found
28+
*
29+
* @param array $data
30+
* @param string $key
31+
* @return mixed
32+
*/
33+
function array_get(array &$data, $key){
34+
if(array_key_exists($key, $data)){
35+
return $data[$key];
36+
}
37+
return false;
38+
}
39+
40+
}
41+
42+
if(!function_exists('array_flatten')){
43+
44+
/**
45+
* Make multidimensional array flat
46+
*
47+
* @param array $array
48+
* @return array
49+
*/
50+
function array_flatten(array $array){
51+
$index = 0;
52+
$count = count($array);
53+
54+
while($index < $count){
55+
if(is_array($array[$index])){
56+
array_splice($array, $index, 1, $array[$index]);
57+
}else{
58+
++$index;
59+
}
60+
$count = count($array);
61+
}
62+
return $array;
63+
}
64+
65+
}
66+
67+
if(!function_exists('array_pick')){
68+
69+
/**
70+
* Return array with only the keys in $keys
71+
*
72+
* @param array $array The source
73+
* @param mixed $keys Keys of $array to return
74+
* @return array
75+
*/
76+
function array_pick(array $array, $keys){
77+
$arguments = func_get_args();
78+
if(func_num_args() > 2){
79+
$keys = array_slice($arguments, 1);
80+
}
81+
if(!is_array($keys)){
82+
$keys = array($keys);
83+
}
84+
return array_intersect_key($array, array_flip($keys));
85+
}
86+
87+
}
88+
89+
if(!function_exists('array_reject')){
90+
91+
/**
92+
* Return array without the keys in $keys.
93+
* This is the inverse of array_pick
94+
*
95+
* @param array $array The source
96+
* @param mixed $keys Keys of $array to exclude
97+
* @return array
98+
*/
99+
function array_reject(array $array, $keys){
100+
$arguments = func_get_args();
101+
if(func_num_args() > 2){
102+
$keys = array_slice($arguments, 1);
103+
}
104+
if(!is_array($keys)){
105+
$keys = array($keys);
106+
}
107+
return array_diff_key($array, array_flip($keys));
108+
}
109+
110+
}
111+
}

phpunit.xml.dist

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<phpunit bootstrap="vendor/autoload.php" colors="true">
3+
<logging>
4+
<log type="coverage-html" target="test/coverage/" charset="UTF-8"
5+
highlight="false" lowUpperBound="35" highLowerBound="70" />
6+
</logging>
7+
<testsuites>
8+
<testsuite name="Array utils Suite">
9+
<directory suffix="_test.php">./test</directory>
10+
</testsuite>
11+
</testsuites>
12+
<filter>
13+
<whitelist addUncoveredFilesFromWhitelist="true">
14+
<directory suffix=".php">lib</directory>
15+
</whitelist>
16+
</filter>
17+
</phpunit>

test/unit/array_test.php

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
class ArrayTest extends PHPUnit_Framework_TestCase {
4+
5+
public function test_array_delete(){
6+
$ar = array('key1' => 'Foo', 'key2' => 'bar');
7+
$this->assertEquals('Foo', array_delete($ar, 'key1'));
8+
$this->assertEquals(array('key2' => 'bar'), $ar);
9+
10+
$this->assertNull(array_delete($ar, 'not_existing'));
11+
$this->assertEquals(array('key2' => 'bar'), $ar);
12+
}
13+
14+
public function test_array_get(){
15+
$ref = array('key1' => 'Foo', 'key2' => 'bar');
16+
$ar1 = $ref;
17+
$this->assertEquals('Foo', array_get($ar1, 'key1'));
18+
$this->assertEquals($ref, $ar1);
19+
$this->assertFalse(array_get($ar1, 'not_existing'));
20+
$this->assertEquals($ref, $ar1);
21+
}
22+
23+
public function test_array_flatten(){
24+
$this->assertEquals(array(), array_flatten(array()));
25+
$this->assertEquals(array(1), array_flatten(array(1)));
26+
$this->assertEquals(array(1), array_flatten(array(array(1))));
27+
$this->assertEquals(array(1, 2), array_flatten(array(array(1, 2))));
28+
$this->assertEquals(array(1, 2), array_flatten(array(array(1), 2)));
29+
$this->assertEquals(array(1, 2), array_flatten(array(1, array(2))));
30+
$this->assertEquals(array(1, 2, 3), array_flatten(array(1, array(2), 3)));
31+
$this->assertEquals(array(1, 2, 3, 4), array_flatten(array(1, array(2, 3), 4)));
32+
$this->assertEquals(array(1, 2, 3, 4, 5, 6), array_flatten(array(1, array(2, 3), 4, array(5, 6))));
33+
}
34+
35+
public function test_array_pick(){
36+
$this->assertEquals(array(), array_pick(array(), array('foo', 'bar', 'baz')));
37+
$this->assertEquals(array(), array_pick(array('bzz' => 'bar'), array('foo', 'bar', 'baz')));
38+
$this->assertEquals(array('foo' => 'bar'), array_pick(array('foo' => 'bar'), array('foo', 'bar', 'baz')));
39+
$this->assertEquals(array('foo' => 'bar'), array_pick(array('foo' => 'bar'), 'foo', 'bar'));
40+
$this->assertEquals(array('foo' => 'bar'), array_pick(array('foo' => 'bar'), 'foo'));
41+
}
42+
43+
public function test_array_reject(){
44+
$this->assertEquals(array(), array_reject(array(), array('foo', 'bar', 'baz')));
45+
$this->assertEquals(array('bzz' => 'bar'), array_reject(array('bzz' => 'bar'), array('foo', 'bar', 'baz')));
46+
$this->assertEquals(array(), array_reject(array('foo' => 'bar'), array('foo', 'bar', 'baz')));
47+
$this->assertEquals(array(), array_reject(array('foo' => 'bar'), 'foo', 'bar'));
48+
$this->assertEquals(array('foo' => 'bar'), array_reject(array('foo' => 'bar'), 'bar'));
49+
}
50+
51+
}

0 commit comments

Comments
 (0)