关于一个php数组去重的问题
场景:
需要从excel中导入信息导数据库。要求如下:
同一订单号下,可以存在多条记录
检测“产品”在“使用产品”(在已有数据表中获取)内,方可导入
表中相同交易单号的多个产品,只要有一个产品在“使用产品”内,就全部导入,记成1条。如果一个都没有则不导入
现在我模拟数据如下:
打印出来的导入数组为:
array (size=4)
'667283818213324' =>
array (size=17)
0 =>
array (size=9)
0 => string '2017年8月12日23:44:58' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112313' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 1
7 => float 2
8 => string '火星' (length=6)
1 =>
array (size=9)
0 => string '2017年8月12日23:44:59' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112314' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 2
7 => float 3
8 => string '火星' (length=6)
2 =>
array (size=9)
0 => string '2017年8月12日23:44:60' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112315' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 3
7 => float 4
8 => string '火星' (length=6)
3 =>
array (size=9)
0 => string '2017年8月12日23:44:61' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112316' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 4
7 => float 5
8 => string '火星' (length=6)
4 =>
array (size=9)
0 => string '2017年8月12日23:44:62' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112317' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 5
7 => float 6
8 => string '火星' (length=6)
5 =>
array (size=9)
0 => string '2017年8月12日23:44:63' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112318' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 6
7 => float 7
8 => string '火星' (length=6)
6 =>
array (size=9)
0 => string '2017年8月12日23:44:64' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112319' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 7
7 => float 8
8 => string '火星' (length=6)
7 =>
array (size=9)
0 => string '2017年8月12日23:44:68' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112323' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 11
7 => float 12
8 => string '火星' (length=6)
8 =>
array (size=9)
0 => string '2017年8月12日23:44:69' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112324' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 12
7 => float 13
8 => string '火星' (length=6)
9 =>
array (size=9)
0 => string '2017年8月12日23:44:70' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112325' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 13
7 => float 14
8 => string '火星' (length=6)
10 =>
array (size=9)
0 => string '2017年8月12日23:44:71' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112326' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 14
7 => float 15
8 => string '火星' (length=6)
11 =>
array (size=9)
0 => string '2017年8月12日23:44:72' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112327' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 15
7 => float 16
8 => string '火星' (length=6)
12 =>
array (size=9)
0 => string '2017年8月12日23:44:73' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112328' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 16
7 => float 17
8 => string '火星' (length=6)
13 =>
array (size=9)
0 => string '2017年8月12日23:44:74' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112329' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 17
7 => float 18
8 => string '火星' (length=6)
14 =>
array (size=9)
0 => string '2017年8月12日23:44:76' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112331' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 19
7 => float 20
8 => string '火星' (length=6)
15 =>
array (size=9)
0 => string '2017年8月12日23:44:77' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112332' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 20
7 => float 21
8 => string '火星' (length=6)
16 =>
array (size=9)
0 => string '2017年8月12日23:44:78' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213324' (length=15)
4 => string 'ruizhaole112333' (length=15)
5 => string 'java大法千秋万代' (length=22)
6 => float 21
7 => float 22
8 => string '火星' (length=6)
'667283818213325' =>
array (size=1)
0 =>
array (size=9)
0 => string '2017年8月12日23:44:65' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213325' (length=15)
4 => string 'ruizhaole112320' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 8
7 => float 9
8 => string '火星' (length=6)
'667283818213326' =>
array (size=1)
0 =>
array (size=9)
0 => string '2017年8月12日23:44:66' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213326' (length=15)
4 => string 'ruizhaole112321' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 9
7 => float 10
8 => string '火星' (length=6)
'667283818213327' =>
array (size=2)
0 =>
array (size=9)
0 => string '2017年8月12日23:44:67' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213327' (length=15)
4 => string 'ruizhaole112322' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 10
7 => float 11
8 => string '火星' (length=6)
1 =>
array (size=9)
0 => string '2017年8月12日23:44:75' (length=24)
1 => string '李锐钊' (length=9)
2 => string '满堂红' (length=9)
3 => string '667283818213327' (length=15)
4 => string 'ruizhaole112330' (length=15)
5 => string '十天PHP从入门到放弃' (length=27)
6 => float 18
7 => float 19
8 => string '火星' (length=6)
(我的思路是用订单号做key来存放数组,但是下一步中检测多个记录在不在产品表中存在至少一个相同记录不知道该如何写,没有头绪)
代码:
// +-----------------------------------------------
// | 导入xls至数据库
// +-----------------------------------------------
public function importXLS()
{
if ($this->request->isPost()) {
$file = $this->request->param('file', '' ,'trim');
$file = ROOT_PATH . 'public' . $file;
if (empty($file)) return $this->error('不能导入空文件');
if (!file_exists($file)) return $this->error('要导入的文件不存在');
// 自动判断后缀名是xls 还是 xlsx,两种不同的后缀需要的类不一样
$extension = strtolower(pathinfo($file, PATHINFO_EXTENSION));
if ($extension =='xlsx') {
$objReader = new PHPExcel_Reader_Excel2007();
} else if ($extension =='xls') {
$objReader = new PHPExcel_Reader_Excel5();
}
$objPHPExcel = $objReader->load($file);
$excelarray=$objPHPExcel->getsheet(0)->toArray();
array_shift($excelarray);//将第一行移出数组
if (empty($excelarray)) {
return $this->error('没有检测到插入数据,请重新编写导入数据列表');
unlink($file);
}
foreach($excelarray as $k=> $v){
$taobaoLists[$v[3]][] = $v;
/* $data[$k]['tb_rq']=$v[0];
$data[$k]['tb_jbr']=$v[1];
$data[$k]['tb_dp']=$v[2];
$data[$k]['tb_orderno']=$v[3];
$data[$k]['tb_ww']=$v[4];
$data[$k]['tb_pro']=$v[5];
$data[$k]['tb_prono']=$v[6];
$data[$k]['tb_xsje']=$v[7];
$data[$k]['tb_address']=$v[8]; */
// $data[$k]['tb_import_type'] = 2; // 数据外部导入
}
// 取出所有使用产品列表
$proLists = Db::name('sys_products')->where('pro_status', 1)->field('pro_name')->select();
$proLists = array_column($proLists, 'pro_name');
foreach ($taobaoLists as $orderNumber => $list) {
if (count($list) > 1) {
foreach ($list as $arr) {
}
} else {
if (!in_array($list[0][5], $proLists)) unset($taobaoLists[$orderNumber]);
}
}
// $excelarray = array_filter(filter_array($excelarray));
dump($taobaoLists);exit;
// // 删除空行,避免用户操作不当造成过多空白数组
if (count($data) < 1) {
return $this->error('没有检测到插入数据,请重新编写导入数据列表');
unlink($data); // 删除文件
}
// 用交易号为下标建立数组
foreach ($data as $row) {
$arrs[$row['tb_orderno']] = $row;
$arrs[$row['tb_orderno']]['items'] = [];
}
foreach ($arrs as $key => $arr) {
// if ($arr['tb_orderno'])
}
dump($proLists); exit;
}
}
先谢谢~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
摸索了一上午时间,把实际需要的怼了出来,不清楚有没有什么BUG,也没做优化。直接上代码:
=====
希望有大神可以给出更好的方案,谢谢