use multibyte functions
[auerswald-callnotifier.git] / src / callnotifier / Functions.php
diff --git a/src/callnotifier/Functions.php b/src/callnotifier/Functions.php
new file mode 100644 (file)
index 0000000..406317f
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+namespace callnotifier;
+
+/**
+ * Some helper functions
+ */
+class Functions
+{
+    /**
+     * Multibyte-version of str_pad
+     *
+     * @link http://stackoverflow.com/a/14773638/282601
+     */
+    public static function mb_str_pad(
+        $input, $pad_length, $pad_string = ' ',
+        $pad_type = STR_PAD_RIGHT, $encoding = 'UTF-8'
+    ) {
+        if (!function_exists('mb_substr')) {
+            return str_pad($input, $pad_length, $pad_string, $pad_type);
+        }
+
+        $input_length = mb_strlen($input, $encoding);
+        $pad_string_length = mb_strlen($pad_string, $encoding);
+
+        if ($pad_length <= 0 || ($pad_length - $input_length) <= 0) {
+            return $input;
+        }
+
+        $num_pad_chars = $pad_length - $input_length;
+
+        switch ($pad_type) {
+        case STR_PAD_RIGHT:
+            $left_pad = 0;
+            $right_pad = $num_pad_chars;
+            break;
+
+        case STR_PAD_LEFT:
+            $left_pad = $num_pad_chars;
+            $right_pad = 0;
+            break;
+
+        case STR_PAD_BOTH:
+            $left_pad = floor($num_pad_chars / 2);
+            $right_pad = $num_pad_chars - $left_pad;
+            break;
+        }
+
+        $result = '';
+        for ($i = 0; $i < $left_pad; ++$i) {
+            $result .= mb_substr($pad_string, $i % $pad_string_length, 1, $encoding);
+        }
+        $result .= $input;
+        for ($i = 0; $i < $right_pad; ++$i) {
+            $result .= mb_substr($pad_string, $i % $pad_string_length, 1, $encoding);
+        }
+
+        return $result;
+    }
+}
+?>