Browse Source

added ArrayHelper::mapIfSet()

Fabian Peter Hammerle 7 years ago
parent
commit
cc1f88ef67
2 changed files with 75 additions and 0 deletions
  1. 21 0
      ArrayHelper.php
  2. 54 0
      tests/ArrayHelperTest.php

+ 21 - 0
ArrayHelper.php

@@ -29,6 +29,27 @@ class ArrayHelper
        }
    }
 
+    /**
+     * @param mixed $source_array
+     * @param \Closure $callback
+     * @return mixed
+     */
+    public static function mapIfSet($source, \Closure $callback)
+    {
+        if($source === null) {
+            return null;
+        } elseif(is_array($source)) {
+            return array_map(
+                function($v) use ($callback) {
+                    return $v === null ? null : $callback($v);
+                    },
+                $source
+                );
+       } else {
+           return $callback($source);
+       }
+   }
+
     /**
      * @param array $source_array
      * @param \Closure $callback

+ 54 - 0
tests/ArrayHelperTest.php

@@ -105,6 +105,11 @@ class ArrayHelperTest extends \PHPUnit_Framework_TestCase
                 function($v) { return strrev($v); },
                 'gnirts',
                 ],
+            [
+                'string',
+                function($v) { return null; },
+                null,
+                ],
             [
                 ['a' => 1, 'b' => 2, 'c' => 3],
                 function($v) { return $v; },
@@ -136,6 +141,55 @@ class ArrayHelperTest extends \PHPUnit_Framework_TestCase
         $this->assertSame($expected, ArrayHelper::map($source, $callback));
     }
 
+    public function mapIfSetProvider()
+    {
+        return [
+            [
+                null,
+                function($v) { return 1; },
+                null,
+                ],
+            [
+                'string',
+                function($v) { return strrev($v); },
+                'gnirts',
+                ],
+            [
+                'string',
+                function($v) { return null; },
+                null,
+                ],
+            [
+                ['a' => 1, 'b' => 2, 'c' => 3],
+                function($v) { return $v; },
+                ['a' => 1, 'b' => 2, 'c' => 3],
+                ],
+            [
+                ['a' => 1, 'b' => 2, 'c' => 3],
+                function($v) { return $v < 2 ? null : $v; },
+                ['a' => null, 'b' => 2, 'c' => 3],
+                ],
+            [
+                ['a' => 1, 'b' => null, 'c' => 3],
+                function($v) { return (string)$v; },
+                ['a' => '1', 'b' => null, 'c' => '3'],
+                ],
+            [
+                ['a' => 1, 'b' => 2, 'b' => 3],
+                function($v) { return $v * $v; },
+                ['a' => 1, 'b' => 4, 'b' => 9],
+                ],
+            ];
+    }
+
+    /**
+     * @dataProvider mapIfSetProvider
+     */
+    public function testMapIfSet($source, $callback, $expected)
+    {
+        $this->assertSame($expected, ArrayHelper::mapIfSet($source, $callback));
+    }
+
     public function multimapProvider()
     {
         return [