Add pl_flatten to transform arrays containing other arrays into a flat
authorFlorent Bruneau <florent.bruneau@polytechnique.org>
Wed, 28 Apr 2010 19:40:53 +0000 (21:40 +0200)
committerFlorent Bruneau <florent.bruneau@polytechnique.org>
Wed, 28 Apr 2010 19:43:24 +0000 (21:43 +0200)
array containing only non-array items.

e.g.:
array(array(1), 2) -> array(1, 2)

include/platal.inc.php
ut/arraytest.php [new file with mode: 0644]

index d8155f5..38912a2 100644 (file)
@@ -182,6 +182,24 @@ function pl_entity_decode($text, $mode = ENT_COMPAT)
     return html_entity_decode($text, $mode, 'UTF-8');
 }
 
+function pl_flatten_aux(array &$dest, array $src)
+{
+    foreach ($src as $val) {
+        if (is_array($val)) {
+            pl_flatten_aux($dest, $val);
+        } else {
+            $dest[] = $val;
+        }
+    }
+}
+
+function pl_flatten(array $array)
+{
+    $res = array();
+    pl_flatten_aux($res, $array);
+    return $res;
+}
+
 /**
  * Returns the path of a static content, including, when appropriate, the
  * version number. This is used to avoid cross-version cache issues, by ensuiring
diff --git a/ut/arraytest.php b/ut/arraytest.php
new file mode 100644 (file)
index 0000000..4ff151d
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+/***************************************************************************
+ *  Copyright (C) 2003-2010 Polytechnique.org                              *
+ *  http://opensource.polytechnique.org/                                   *
+ *                                                                         *
+ *  This program is free software; you can redistribute it and/or modify   *
+ *  it under the terms of the GNU General Public License as published by   *
+ *  the Free Software Foundation; either version 2 of the License, or      *
+ *  (at your option) any later version.                                    *
+ *                                                                         *
+ *  This program is distributed in the hope that it will be useful,        *
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *  GNU General Public License for more details.                           *
+ *                                                                         *
+ *  You should have received a copy of the GNU General Public License      *
+ *  along with this program; if not, write to the Free Software            *
+ *  Foundation, Inc.,                                                      *
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
+ ***************************************************************************/
+
+require_once dirname(__FILE__) . '/../include/test.inc.php';
+
+class ArrayTest extends PlTestCase
+{
+    public static function flattenProvider()
+    {
+        return array(
+            array(array(1, 2, 3, 4), array(1, 2, 3, 4)),
+            array(array(1, 2, array(3, 4)), array(1, 2, 3, 4)),
+            array(array(array(1, 2), array(3), array(4)), array(1, 2, 3, 4)),
+            array(array(array(array(1, 2)), array(3), 4), array(1, 2, 3, 4))
+        );
+    }
+
+    /**
+     * @dataProvider flattenProvider
+     */
+    public function testFlatten(array $src, array $res)
+    {
+        $this->assertSame($res, pl_flatten($src));
+    }
+}
+
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>