新需求:把从美团、饿了么导出的订单进行商品分解,因为导出来的表格中的商品信息存放在一个单元格里,其中含有多个商品和不同的数量,这就要进行分割,处理后导入到数据库中。
一、美团订单商品信息(都只有一个米号喔,只是我打出来一个博客又不显示,只能多打几个):
1、单个商品
香辣口水鸡+红烧茄子双拼饭.(),单价15.8***数量1+餐盒2.0***数量1.0
2、多个商品
奥尔良鸡排+红烧茄子双拼饭.(),单价14.8***数量1+餐盒2.0**数量1.0/「限量抢购」台湾烤香肠.(单点不送,需搭配主餐)(),单价0.99数量1+餐盒1.0***数量1.0
二、饿了么商品信息
1、单个商品
招牌棒棒鸡饭+可乐_1*33.8
2、多个商品
【自选】招牌鸡饭+贡茶._142.800000000000004+大米饭…(不是主食,单点不送)-大米饭_13.0
二、商品信息、数量分割
1、寻找商品信息规律
美团的比较简单,单个商品以“/”进行分割,商品名截取“(”之前的字符串,商品数量就截取“量”子后面的字符串。
饿了么我就不仔细分析,真的很难分(我懒得打字),就不能像人家美团的那种简洁一点?非要用"+"号来分割,然后单个的商品名有的也有“+”号,有的还有好几个,单单为了找这个规律就费我老长时间,哼!用户体验极差!
分割规律在我博客主页的资源里面,思维导图版本需要2个积分,PNG版本不需要积分。如果您有更简单的分割方法(分割规律),请与我留言讨论,不胜感激~~
三、分割时用到的函数、方法
$count = substr_count($value['dishes'], '/');
//统计整个商品信息中有几个“/”(美团)
/**
* 按符号截取字符串的指定部分
* @param string $str 需要截取的字符串
* @param string $sign 需要截取的符号
* @param int $number 如是正数以0为起点从左向右截 负数则从右向左截
* @return string 返回截取的内容
*/
public function cut_str($str,$sign,$number){
$array=explode($sign, $str);
$length=count($array);
if($number<0){
$new_array=array_reverse($array);
$abs_number=abs($number);
if($abs_number>$length){
return 'error';
}else{
return $new_array[$abs_number-1];
}
}else{
if($number>=$length){
return 'error';
}else{
return $array[$number];
}
}
}
$number = substr(strstr($item_data[$i], '数'),0,7);
//strstr() 函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE。他也可以返回字符串之前的部分,详细请看菜鸟教程
$number = substr(strstr($value['dishes'], '数'),0,7);
//substr() 函数返回字符串的一部分。
//substr(string,start,length)
//start为正数 - 在字符串的指定位置开始;
//start为负数 - 在从字符串结尾的指定位置开始;
//start为0 - 在字符串中的第一个字符处开始
str_replace('T', ' ', $value['order_time']);
//str_replace(find,replace,string,count)
//find 必需。规定要查找的值;
//replace 必需。规定替换 find 中的值的值;
//string 必需。规定被搜索的字符串;count 可选。一个变量,对替换数进行计数。
//谁能想到饿了么导出的订单表里的时间中间有个T呢!还得处理一遍,看看人家美团!
if(strpos($data_d[$i],'*')==FALSE){}
//strpos(string,find,start);
//string 必需。规定被搜索的字符串;
//find 必需。规定要查找的字符;start 可选。规定开始搜索的位置。
//返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。注释: 字符串位置从 0 开始,不是从 1 开始。
需要注意的是,不同文件,字符占用的字节数不一样: