php无法调用array_map的函数

时间:2013-05-14 09:13:23

标签: php

我正在使用php 5.2.10我想在数组上做array_map并且我为数组映射创建了一个函数

function get_result(){
    $result = mysql_query("Select * from table");
    while($cr = mysql_fetch_array($result)){
        $b = array_map(`calc`,$cr);
        $rr_id = $cr['batch_id'].$cr['seq_id'];
  $mqrrid = '999'.$rr_id;
  $question_id = $cr['question_id'];
        foreach ($b as $k => $v){
            if(preg_match('{^Item \d+$}',$k)){
                $new_insert[] = array(
                    'r_id'=>$mqrrid,
                    'q_id' =>$q_id,
                    'c_id' =>$k,
                    'rank'=>$v
                );
            }
        }
    }
}   

function calc($n){
    foreach($n as $m=> &$x) {
        if (preg_match('{^Item \d+$}', $m)) {
            if($x == null){
                $x = $x;
            }else {
                $x = $x - 1;
            }
        }
    }   
    return $n;
}

我不知道为什么我不能在calc中调用函数array_map .....我无法弄清楚原因..... 谁能帮我 ?

原始数组:(实际上array_map(calc,$ cr之后的输出)与以下相同)

array(23) {
["batch_id"]=>
string(1) "1"
["seq_id"]=>
string(1) "1"
["question_id"]=>
string(4) "2086"
["Item 1"]=>
string(1) "1"
["Item 2"]=>
string(1) "2"
["Item 3"]=>
string(1) "3"
["Item 4"]=>
string(1) "4"
["Item 5"]=>
string(1) "5"
["Item 6"]=>
NULL

我需要的是:(减去第1项到第6项的值,如果它的null只是留下它〜)

array(23) {
["batch_id"]=>
string(1) "1"
["seq_id"]=>
string(1) "1"
["q_id"]=>
string(4) "2086"
["Item 1"]=>
string(1) "0"
["Item 2"]=>
string(1) "1"
["Item 3"]=>
string(1) "2"
["Item 4"]=>
string(1) "3"
["Item 5"]=>
string(1) "4"
["Item 6"]=>
NULL

最后,结果将如下所示:(第1项和第6项的例子)

 array(4) {
["r_id"]=>
string(5) "99911"
["q_id"]=>
string(4) "2086"
["c_id"]=>
string(6) "Item 1"
["rank"]=>
string(1) "0"
}
array(4) {
["r_id"]=>
string(5) "99916"
["q_id"]=>
string(4) "2086"
["c_id"]=>
string(6) "Item 6"
["rank"]=>
string(4) NULL
}

2 个答案:

答案 0 :(得分:3)

calc应该是全局的,否则无法找到。此外,你应该传递一个字符串(没有',而是包含在'或'中)。

此外,一般情况下(如果您使用的是PHP 5.3),最好将函数引用传递给array_map函数,而不是字符串:

$func = function calc() { ... }
array_map($func, $cr);

答案 1 :(得分:1)

我认为您不必为array_map准备函数。

function get_result($link_identifier = NULL) {
    $result = mysql_query('Select * from table', $link_identifier);
    $new = array();
    while ($rows = mysql_fetch_assoc($result)) {
        $r_id = '999' . $rows['batch_id'] . $rows['seq_id'];
        foreach ($rows as $k => $v) {
            if ($v !== null && preg_match('@^Item \\d+$@', $k)) {
                $v = (string)((int)$v + 1);
            }
            $new[] = array(
                'r_id' => $r_id,
                'q_id' => $rows['question_id'],
                'c_id' => $k,
                'rank' => $v,
            );
        }
    }
    return $new;
}