mysql 存储过程 模拟 php的explode 函数

本文介绍了如何在MySQL中使用存储过程模拟PHP的explode函数,以实现字符串分割功能。通过创建两个函数`func_get_split_string`和`func_get_split_string_total`,分别用于获取指定分隔符和位置的子字符串以及统计分割后的字符串数量。此外,还提供了一个存储过程`sp_print_result`,演示了如何结合这两个函数处理文件内容并进行随机选择。

今天 想模拟数据 为了 数据库分区用,想直接用mysql 实现 但是没有类似于php的explode 函数

gold.txt内容如下:

activity_find_back
add_jjc_chalenge_times
all_server_cup_egg
all_server_cup_encourange
all_server_cup_flower
all_server_cup_praise
all_server_cup_support
amulet_advance
amulet_growup_growup
amulet_growup_soul
amulet_growup_spirit
amulet_refresh_skill_book
equipment_lingyun

-- 获取有字符串 如上-面的例子 此方法会去掉'\n'

drop FUNCTION if exists `func_get_split_string`;
CREATE DEFINER=`pay_center`@`%` FUNCTION `func_get_split_string`( f_string varchar(1000),f_delimiter varchar(5),f_order int) RETURNS varchar(255) CHARSET utf8
DETERMINISTIC
BEGIN
declare result varchar(255) default '';
set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1));
return result;
END

=======================================================================

-- 根据'\n'为分割 统计有多少个
drop FUNCTION if exists `func_get_split_string_total`;
CREATE DEFINER=`pay_center`@`%` FUNCTION `func_get_split_string_total`(
f_string varchar(1000),f_delimiter varchar(5)
) RETURNS int(11)
DETERMINISTIC
BEGIN

-- Get the total number of given string.
return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')));
END

=========================================================================

-- 执行
drop procedure if exists `sp_print_result`;
CREATE DEFINER=`pay_center`@`%` procedure `sp_print_result`(
 IN rand_str varchar(10000),IN f_delimiter varchar(5)
)

set @rand_str = load_file('/tmp/gold.txt');

drop procedure if exists proce_range_partition_by_primary;
create procedure proce_range_partition_by_primary(count int(11),rand_str varchar(1000),f_delimiter char(5))
begin
declare i int(11)  default 0;
declare j int(11)  default 0;

declare cnt int default 0;

//这一行是注视

-- username     id     uid     roleid     changecount     newcount     reason     create_time     type_str

set cnt = func_get_split_string_total(rand_str,f_delimiter);

select cnt;

-- 因为mysqll 里没有类似于 php的 获取一个数组的随即单元的函数,所以我存到了 内存表里

drop table if exists tmp_print;
create temporary table tmp_print (reason varchar(30)character set utf8 default null)engine=memory default CHARSET=utf8;

while j < cnt
do
set j = j + 1;
insert into tmp_print(`reason`) values (func_get_split_string(rand_str,f_delimiter,j));
end while;
select * from tmp_print;
while i<= count do
set @i_s = i;
set @str='QWERTYUIOPLKJHGFDSAZXCVBNMqwertyuioplkjhgfdsazxcvbnm1234567890';
set @roleid = bin(@i_s);

set @mod = mod(@i_s,2);
if @mod is null then
 set @changecount = @i_s;
 set @newcount =  @i_s/2;
else
set @newcount =  round(@i_s/2);
set @changecount =  -i;
end if;
set i=i+1;

set @username = upper(md5(concat(@i_s,@str)));

-- 随机取出一个值

select * into @reasons from tmp_print order by rand() limit 1;
set @create_time = UNIX_TIMESTAMP()+i;
select @username,@i_s,@roleid,@changecount,@newcount,@reasons,@create_time;
insert into log_role_gold_change_bak set username = @username ,roleid = @roleid,changecount= @changecount, newcount = @newcount,reason = @reasons,create_time = @create_time;
set i=i+1;
end while;

end;


<think>好的,我现在需要回答用户关于PHPexplode函数的用法的问题。首先,我得仔细回顾一下explode函数的基础知识。记得explode是用来将字符串按特定分隔符分割数组的,对吧?用户可能需要知道它的基本语法、参数以及一些实际例子。 首先,我应该确认函数的基本结构:explode(分隔符,字符串,限制)。分隔符是必需的,字符串也是必需的,限制参数是可选的,用来控制返回数组的元素数量。如果限制是正数,数组最多包含那个数量的元素,最后一个元素包含剩余部分。如果是负数,则去除最后几个元素。零的话可能当作1处理?需要查证一下,但根据引用中的例子,比如限制为2,那么数组会有两个元素,第二个包含剩下的内容。 然后,用户可能需要一些示例来理解如何使用。例如,用逗号分割字符串,或者用空格分割句子。根据引用[3]中的例子,分割后的数组索引默认从0开始,但用户可能想知道如何让索引从1开始,这时候可以用array_combine和range函数结合,如引用[3]中的代码所示。 另外,用户提到的引用[4]中有split函数的使用,但注意到split在PHP中已经被弃用,推荐使用preg_split或者explode,所以可能需要提醒用户避免使用split,改用explode或其他函数。 接下来,要确保回答覆盖基本用法、参数说明、示例代码,以及常见问题,比如如何处理分割后的数组索引,或者如何处理多字符分隔符。不过explode的分隔符是字符串,但如果是多个字符可能需要注意,比如“-”和“.”作为分隔符的情况可能需要用正则表达式,这时候可能用到preg_split,但explode不支持正则,这点需要明确。 还要注意安全问题,比如当处理用户输入时,分隔符可能存在注入风险,需要适当清理。不过这可能超出基础用法,用户可能暂时不需要,但可以提及。 现在整理结构:首先介绍函数,参数说明,基本示例,限制参数的作用,索引调整方法,注意事项(比如split已弃用),以及相关函数如implode。最后生相关问题,引导用户深入学习。 需要确保所有代码示例正确,比如引用[3]中的代码是否正确使用array_combine和range来调整索引。是的,range(1, count(...))生从1开始的键,然后与分割后的数组合并,正确。 最后,检查是否有遗漏,比如是否提到返回值的细节,比如如果分隔符不在字符串中,会返回包含原字符串数组。或者空字符串的情况如何处理?比如分隔符为空字符串会报错,需要强调分隔符不能为空,否则会触发错误。 总结下来,回答应包括:定义、语法、参数解释、基本示例、限制参数示例、调整索引的示例、注意事项(split已弃用,分隔符不能为空等)、相关函数,最后生相关问题。</think>### PHP explode函数用法详解 **1. 函数定义** `explode`函数用于将一个字符串指定分隔符分割数组,语法为: $$explode(string \$separator, string \$string, int \$limit = PHP_INT_MAX): array$$ - `\$separator`:必需参数,表示分割字符串的分隔符 - `\$string`:必需参数,待分割的原始字符串 - `\$limit`:可选参数,控制返回数组的元素数量[^2] --- **2. 基础用法示例** ```php $str = "苹果,香蕉,橙子"; $arr = explode(",", $str); print_r($arr); // 输出:Array ( [0] => 苹果 [1] => 香蕉 [2] => 橙子 ) ``` --- **3. 参数限制详解** | 限制值类型 | 效果 | |----------|------| | `\$limit > 0` | 返回最多\$limit个元素,最后一个元素包含剩余内容 | | `\$limit < 0` | 去除最后abs(\$limit)个元素 | | `\$limit = 0` | 当作1处理 | **示例代码:** ```php $str = "A-B-C-D-E"; print_r(explode("-", $str, 3)); // 输出:[A, B, C-D-E] print_r(explode("-", $str, -2)); // 输出:[A, B, C] ``` --- **4. 索引调整技巧** 默认数组索引从0开始,可通过`array_combine`调整起始索引: ```php $str = "PHP,Python,Java"; $arr = explode(",", $str); $newArr = array_combine(range(1, count($arr)), $arr); // 索引从1开始[^3] ``` --- **5. 注意事项** - 若分隔符为空字符串`""`,函数将返回`FALSE`并抛出警告 - 处理多字符分隔符时,需完整匹配(不支持正则表达式) - `split()`函数已弃用,建议改用`preg_split()`或`explode()`[^4] --- **6. 相关函数** - `implode()`:将数组元素连接为字符串 - `preg_split()`:支持正则表达式的字符串分割
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值