Php 函数中的函数变量未被识别

Php 函数中的函数变量未被识别,php,multidimensional-array,associative-array,Php,Multidimensional Array,Associative Array,因此,我有一个函数,它可以很好地将数组中特定字段的所有值相加,在本例中是num_ 数组是这样的 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"

因此,我有一个函数,它可以很好地将数组中特定字段的所有值相加,在本例中是num_

数组是这样的

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,但没有什么区别,而是说全局$field没有在任何地方使用。我做错了什么

public static function sumFieldArray($field,$array)
    {
        $field_sum = array_sum(array_map(
            function($element, $field){
                return $element[$field];
            },
            $array));
        return $field_sum;
    }
array\u 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;
    }
如果您使用的是PHP5.5+,还可以使用该函数提取该字段的所有值

public static function sumFieldArray($field,$array)
    {
        return array_sum(array_column($array, $field));
    }
array\u 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;
    }
如果您使用的是PHP5.5+,还可以使用该函数提取该字段的所有值

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

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


此处的更多信息:

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


这里有更多信息:

php有两个作用域:全局(代码的顶级)和局部(在当前块中)。在某个中间级别定义的变量本质上是完全不可访问的,因为全局变量只适用于绝对顶级范围。没有
parent$var
祖父母$var
作用域功能。@MarcB您忘记了函数表达式中的
use()
选项。@barmar:是的,没错。但这是必须在父范围内完成的事情。子对象无法回过头来获取这些内容。php在当前块中正好有两个作用域:全局(代码的顶级)和局部。在某个中间级别定义的变量本质上是完全不可访问的,因为全局变量只适用于绝对顶级范围。没有
parent$var
祖父母$var
作用域功能。@MarcB您忘记了函数表达式中的
use()
选项。@barmar:是的,没错。但这是必须在父范围内完成的事情。一个孩子不能回过头去拿那些东西。这本来是我的首选答案,因为它提供了有用的数组列版本,尽管这对我来说不起作用,因为我没有PHP5.5。其他人会发现它很有用,但是代码无效。在php storm中,它说它期望(在函数这样做之后)“函数使用($field)($element){”不起作用。我想它只是需要一个快速的调整,这将是一个有用的答案,谢谢你的帮助。我把
use
选项放错了位置,它在参数列表后面。这将是我的首选答案,因为它提供了有用的数组列版本,尽管这对我来说不起作用,因为我没有php 5.5我会发现它很有用,但是代码无效。在php storm中,它说它期望(在函数这么做之后)“函数使用($field)($element){”将不起作用。我想它只需要快速调整一下,这将是一个有用的答案,感谢您的帮助。我把
使用
选项放在了错误的位置,它放在参数列表后面。