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

variable of function within a function is not being recognized

所以我有这个函数,它非常适合将数组中特定字段的所有值相加,在这种情况下 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 值未在任何地方使用,但在函数中很明显。

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

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

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));
    }

你说得对,这是范围问题。您必须使用 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