foreach 只执行一次

2014-11-28 09:57:33 +08:00
 444683462
问题是为什么foreach每次只执行一次。
一批数据处理的话,第一个正确会正常处理。后面就不动了。

需要执行:
将下面数据中的某一个数据$one转到$two。
左边删除$one.右边没有$two则新增,有则不增加。

staff_departmentid的数据结构例如:
7-8-9-6
6-7-9
8-9-10-6
8-9
————————————————————————————————————————
$one=I('post.one');
$two=I('post.two');

$m=M('staff');
//第一步 先查找左边准备要修改的值
$conone['staff_departmentid']=array('like',"%".$one."%");
$list=$m->where($conone)->select();

foreach ($list as $key => $value) {

$arr=explode('-',$value['staff_departmentid']);
$array_key = array_search($one,$arr);
unset($arr[$array_key]);
//重新设计索引
$arr=array_values($arr);
$nowstr=implode('-',$arr);
//首先减去$one值
$w1['staff_id']=$value['staff_id'];
$data['staff_departmentid']=$nowstr;
$jian=$m->where($w1)->save($data);

//如果已有$two值则不增加。没有则新增
$array2_key = array_search($two,$arr);

if($array2_key||$array2_key===0){
//有就不添加
}else{
//没有我们就添加一个试试
$arr[]=$two;
$arr=array_values($arr);
$addstr=implode('-',$arr);

$adddata['staff_departmentid']=$addstr;

$w2['staff_id']=$value['staff_id'];
$jia=$m->where($w2)->save($adddata);
}
}
5186 次点击
所在节点    PHP
19 条回复
abelyao
2014-11-28 10:20:36 +08:00
好像是基于 ThinkPHP 的代码?
444683462
2014-11-28 10:24:20 +08:00
@abelyao 是的。能否解决这个问题。耽误半天功夫了。
abelyao
2014-11-28 10:26:26 +08:00
@444683462 循环之前先 print_r($list) 看看到底 $list 是有几个嘛,说不定是 SQL 查询结果的问题
444683462
2014-11-28 10:39:34 +08:00
@abelyao 谢谢。已经测试了。不是这里的问题。SQL查询是正确的
justfindu
2014-11-28 10:50:08 +08:00
我猜最大可能是这条 if($array2_key||$array2_key===0){}
你的$two值, 第一次执行之后发现没有就增加了, 然后第二次执行是不是就会发现有了 就不执行, 你可以在这个条件设置一个断点看看?
444683462
2014-11-28 10:55:07 +08:00
@justfindu 谢谢你的解囊。$two就是需要改成的值。应该是不增加的。zend studio或者sublime怎么设置断点 在哪里查看
justfindu
2014-11-28 10:59:05 +08:00
zend studio 用xbug 调试, 不然就只能手动每条echo 或者dump了
444683462
2014-11-28 11:02:23 +08:00
@justfindu 需要重新下载还是集成了 在哪里找
feiyuanqiu
2014-11-28 11:17:56 +08:00
代码有几个问题:


另外,没看懂lz需求...
zts1993
2014-11-28 11:29:04 +08:00
看到I 函数,,ThinkPHP、、、
xummerj
2014-11-28 11:45:30 +08:00
呃,数据没错,foreach只一次,那应该是代码异常中断了吧,把debug打开看下
444683462
2014-11-28 11:58:07 +08:00
@feiyuanqiu 这什么编辑器什么色调 好顺眼
444683462
2014-11-28 11:58:28 +08:00
@xummerj 请问一下如何debug。只知道js可以debug
444683462
2014-11-28 11:59:31 +08:00
@feiyuanqiu 首先非常感谢。select()是返回所有查询到的数据。
feiyuanqiu
2014-11-28 12:12:02 +08:00
午休了,我自己试着写了一下,我还是觉得问题出在最开始获取数据那里,你最好把$list var_dump出来看一下

444683462
2014-11-28 12:42:55 +08:00
@feiyuanqiu $list是正确的。我输出错。能否把代码贴出来一下。先午休哈。打扰了
feiyuanqiu
2014-11-28 13:13:58 +08:00
<pre>
$one = '7'; $two = '6';
$update = array();
if (is_numeric($one) && is_numeric($two)) {
// 获取 $list ... blabla ... 省略
$list = array(
array('staff_departmentid' => '7-8-9-6', 'staff_id' => '1'),
array('staff_departmentid' => '6-7-9', 'staff_id' => '2'),
array('staff_departmentid' => '8-9-10-6', 'staff_id' => '3'),
array('staff_departmentid' => '8-9', 'staff_id' => '4'),
array('staff_departmentid' => '7-8-9-6-7', 'staff_id' => '5'),
);

foreach ($list as $lval) {
$remove_one = str_replace($one, '', $lval['staff_departmentid']);
if ($remove_one !== false) {
$lval['staff_departmentid'] = implode('-', array_filter(explode('-', $remove_one)));
$update[$lval['staff_id']] = array('staff_departmentid' => $lval['staff_departmentid']);
}
if (strpos($lval['staff_departmentid'], $two) === false) {
$update[$lval['staff_id']] = array('staff_departmentid' => implode('-', array_filter(explode('-', "{$lval['staff_departmentid']}-{$two}"))));
}
}
}
var_dump($update);exit;
</pre>
444683462
2014-11-28 14:33:28 +08:00
@feiyuanqiu 谢谢了。不知道怎么地,重新写了一遍又正确了。你用的是submile编辑器么 什么字体 挺好看的
javaluo
2014-11-28 23:22:21 +08:00
@feiyuanqiu 求配色方案

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/149876

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX