0

我有一个数组:

Array
(
    [0] => Array
  (
      [batch_id] => 1
      [seq_id] => 1
      [q_id] => 2046
      [a1] => 0
      [a2] => 1
      [a3] => 2
      [a4] => 3
      [a5] => 4

  )
)

我需要将 a1-a5 的值减去 1

期望结果(例如 a1):

 array(4) {
["w_id"]=>
string(5) "99911"
["q_id"]=>
string(4) "2046"
["c_id"]=>
string(6) "a1"
["rank"]=>
int(1) "-1"
}

我的代码如下:

$result = mysql_query("Select * from table_1");     
while($cr = mysql_fetch_array($result)){    
    $rr_id = $cr['batch_id'].$cr['seq_id'];
    $rid = '999'.$rr_id;
          $q_id = $cr['q_id'];
     foreach ($cr as $k => $v){
  if(preg_match('{^a\d+$}',$k)){
    $new_insert[] = array(
        'w_id'=>$rid,
        'q_id' =>$q_id,
        'c_id' =>$k,
        'rank'=>$v-1
);
     }
  }

但是,排名的结果变为

array(4) {
["w_id"]=>
string(5) "99911"
["q_id"]=>
string(4) "2046"
["c_id"]=>
string(6) "a1"
["rank"]=>
int(0)
}

无法显示排名值

我的代码有什么问题吗?有人可以回答我的问题,非常感谢

4

4 回答 4

2

您可以使用 :

$data = array_map(function ($v) {
    foreach($v as $k => &$x) {
        if (preg_match('{^a\d+$}', $k)) {
            $x = $x - 1;
        }
    }
    return $v;
}, $data);

print_r($data);

现场演示

于 2013-05-10T09:16:57.963 回答
1
preg_match('{^Item \d+$}',$k)

你在 preg_match 中有错误的模式(你正在寻找的键是'a1','a2'......不是'item 1','item 2'......),只需使用这个:

preg_match('{^a\d+$}',$k)
于 2013-05-10T09:23:41.610 回答
0

只需使用循环和预递减

foreach($cr as $k=>&$v)
{
 --$v['a1'];--$v['a2'];--$v['a3'];--$v['a4'];--$v['a5'];
}

print_r($cr);
于 2013-05-10T09:16:48.220 回答
0

我使用 $cr 作为你的数组。

$cr[] = array("batch_id"=>1, "seq_id"=>1, "q_id"=>'2046', "a1"=>1,"a2"=>1,"a3"=>1,"a4"=>1,"a5"=>1);

foreach($cr as $k=>&$v){
  $v['a1'] = $v['a1'] - 1;
  $v['a2'] = $v['a2'] - 1;
  $v['a3'] = $v['a3'] - 1;
  $v['a4'] = $v['a4'] - 1;
  $v['a5'] = $v['a5'] - 1;
}
print_r($cr);
于 2013-05-10T09:28:50.373 回答