From: Ilia Alshanetsky Date: Fri, 7 Feb 2003 21:36:18 +0000 (+0000) Subject: Added str_split() function. This function can be used to break down a X-Git-Tag: RELEASE_0_5~1227 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=67b19b08e3928e41f7aa163d0ef0a9bf6e4837de;p=php Added str_split() function. This function can be used to break down a string into an array. --- 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 #endif + +#include + #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