V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
444683462
V2EX  ›  PHP

foreach 只执行一次

  •  
  •   444683462 · 2014-11-28 09:57:33 +08:00 · 5240 次点击
    这是一个创建于 3650 天前的主题,其中的信息可能已经有所发展或是发生改变。
    问题是为什么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);
    }
    }
    19 条回复    2014-11-28 23:22:21 +08:00
    abelyao
        1
    abelyao  
       2014-11-28 10:20:36 +08:00
    好像是基于 ThinkPHP 的代码?
    444683462
        2
    444683462  
    OP
       2014-11-28 10:24:20 +08:00
    @abelyao 是的。能否解决这个问题。耽误半天功夫了。
    abelyao
        3
    abelyao  
       2014-11-28 10:26:26 +08:00
    @444683462 循环之前先 print_r($list) 看看到底 $list 是有几个嘛,说不定是 SQL 查询结果的问题
    444683462
        4
    444683462  
    OP
       2014-11-28 10:39:34 +08:00
    @abelyao 谢谢。已经测试了。不是这里的问题。SQL查询是正确的
    justfindu
        5
    justfindu  
       2014-11-28 10:50:08 +08:00
    我猜最大可能是这条 if($array2_key||$array2_key===0){}
    你的$two值, 第一次执行之后发现没有就增加了, 然后第二次执行是不是就会发现有了 就不执行, 你可以在这个条件设置一个断点看看?
    444683462
        6
    444683462  
    OP
       2014-11-28 10:55:07 +08:00
    @justfindu 谢谢你的解囊。$two就是需要改成的值。应该是不增加的。zend studio或者sublime怎么设置断点 在哪里查看
    justfindu
        7
    justfindu  
       2014-11-28 10:59:05 +08:00
    zend studio 用xbug 调试, 不然就只能手动每条echo 或者dump了
    444683462
        8
    444683462  
    OP
       2014-11-28 11:02:23 +08:00
    @justfindu 需要重新下载还是集成了 在哪里找
    feiyuanqiu
        9
    feiyuanqiu  
       2014-11-28 11:17:56 +08:00
    代码有几个问题:


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

    444683462
        16
    444683462  
    OP
       2014-11-28 12:42:55 +08:00
    @feiyuanqiu $list是正确的。我输出错。能否把代码贴出来一下。先午休哈。打扰了
    feiyuanqiu
        17
    feiyuanqiu  
       2014-11-28 13:13:58 +08:00   ❤️ 1
    <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
        18
    444683462  
    OP
       2014-11-28 14:33:28 +08:00
    @feiyuanqiu 谢谢了。不知道怎么地,重新写了一遍又正确了。你用的是submile编辑器么 什么字体 挺好看的
    javaluo
        19
    javaluo  
       2014-11-28 23:22:21 +08:00 via Android
    @feiyuanqiu 求配色方案
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6020 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:07 · PVG 10:07 · LAX 18:07 · JFK 21:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.