summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/standard/basic_functions.c1
-rw-r--r--ext/standard/php_string.h1
-rw-r--r--ext/standard/string.c39
3 files changed, 40 insertions, 1 deletions
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index 8554537645..3809dc145b 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -342,6 +342,7 @@ function_entry basic_functions[] = {
PHP_FE(strrchr, NULL)
PHP_FE(str_shuffle, NULL)
PHP_FE(str_word_count, NULL)
+ PHP_FE(str_split, NULL)
#ifdef HAVE_STRCOLL
PHP_FE(strcoll, NULL)
diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h
index debe85ade0..60a6c23af2 100644
--- a/ext/standard/php_string.h
+++ b/ext/standard/php_string.h
@@ -87,6 +87,7 @@ PHP_FUNCTION(str_pad);
PHP_FUNCTION(sscanf);
PHP_FUNCTION(str_shuffle);
PHP_FUNCTION(str_word_count);
+PHP_FUNCTION(str_split);
#ifdef HAVE_STRCOLL
PHP_FUNCTION(strcoll);
#endif
diff --git a/ext/standard/string.c b/ext/standard/string.c
index 02912b4bbd..fe2f8bfe23 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -37,6 +37,9 @@
#ifdef HAVE_MONETARY_H
# include <monetary.h>
#endif
+
+#include <math.h>
+
#include "scanf.h"
#include "zend_API.h"
#include "zend_execute.h"
@@ -4296,10 +4299,44 @@ PHP_FUNCTION(money_format) {
RETURN_STRINGL(erealloc(str, str_len + 1), str_len, 0);
}
-
/* }}} */
#endif
+/* {{{ proto array str_split(string str [, int split_length])
+ Convert a string to an array. If split_length is specified, break the string down into chunks each split_length characters long. */
+PHP_FUNCTION(str_split) {
+ char *str;
+ int str_len;
+ long split_length = 1;
+ char *p;
+ int n_reg_segments;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &str, &str_len, &split_length) == FAILURE) {
+ return;
+ }
+
+ if (split_length <= 0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "The the length of each segment must be greater then zero.");
+ RETURN_FALSE;
+ }
+
+ array_init(return_value);
+
+ n_reg_segments = floor(str_len / split_length);
+ p = str;
+
+ while (n_reg_segments-- > 0) {
+ add_next_index_stringl(return_value, p, split_length, 1);
+ p += split_length;
+ }
+
+ if (p != (str + str_len)) {
+ add_next_index_stringl(return_value, p, (str + str_len - p), 1);
+ }
+}
+/* }}} */
+
+
/*
* Local variables:
* tab-width: 4