函数内的函数变量未被识别

时间:2015-12-10 21:40:29

标签: php multidimensional-array associative-array

所以我有这个功能,可以很好地将数组中特定字段的所有值的总和相加,在本例中为num_sold

所以数组是这样的

array(4) {
  [0]=>
  array(2) {
    ["num_sold"]=>
    string(1) "6"
    ["id_product"]=>
    string(1) "2"
  }
  [1]=>
  array(2) {
    ["num_sold"]=>
    string(1) "6"
    ["id_product"]=>
    string(1) "3"
  }
  [2]=>
  array(2) {
    ["num_sold"]=>
    string(1) "4"
    ["id_product"]=>
    string(1) "4"
  }
  [3]=>
  array(2) {
    ["num_sold"]=>
    string(1) "5"
    ["id_product"]=>
    string(1) "7"
  }
}

// this correctly returns 21
$total = array_sum(array_map(
        function($element){
            return $element['num_sold'];
        },
        $array));

现在我希望能够在其他字段名称上重用此函数,因此我想创建一个函数,但是$ field值没有通过。在php storm中,它表示sumFieldArray($ field,$ array)中的$ field值在任何地方都没有使用,但它明显在函数中。

我猜这可能是一个范围问题,所以我尝试在第一行做全局$ field但是没有区别,而是现在说全局$字段没有在任何地方使用。我做错了什么。

public static function sumFieldArray($field,$array)
    {
        $field_sum = array_sum(array_map(
            function($element, $field){
                return $element[$field];
            },
            $array));
        return $field_sum;
    }

2 个答案:

答案 0 :(得分:2)

array_sum()只使用一个参数(数组元素)调用该函数。它不会通过$field作为第二个参数。您可以使用use()选项允许内部函数访问外部作用域中的变量。

public static function sumFieldArray($field,$array)
    {
        $field_sum = array_sum(array_map(
            function ($element) use($field) {
                return $element[$field];
            },
            $array));
        return $field_sum;
    }

如果你使用PHP 5.5+,你也可以使用array_column函数来提取该字段的所有值。

public static function sumFieldArray($field,$array)
    {
        return array_sum(array_column($array, $field));
    }

答案 1 :(得分:2)

你是对的,这是一个范围问题。您必须使用 use 继承父作用域。

public static function sumFieldArray($field, $array)
{
    $field_sum = array_sum(array_map(
        function($element, $field) use ($field) {
            return $element[$field];
        },
        $array));
    return $field_sum;
}

此处提供更多信息:http://php.net/manual/en/functions.anonymous.php