Php 如何使用键合并子数组并求和值?

Php 如何使用键合并子数组并求和值?,php,multidimensional-array,merge,sum,Php,Multidimensional Array,Merge,Sum,我是PHP新手,在数组和数据组合方面遇到了一些问题。我有以下从foreach循环创建的数组: array(1) { [36868]=> int(3) } array(1) { [2112]=> int(3) } array(1) { [35901]=> int(3) } array(1) { [6496]=> int(3) } array(1) { [87]=> int(3) } array(1) {

我是PHP新手,在数组和数据组合方面遇到了一些问题。我有以下从foreach循环创建的数组:

array(1) {
    [36868]=> int(3)
}
array(1) {
    [2112]=> int(3)
} 
array(1) { 
    [35901]=> int(3) 
} 
array(1) { 
    [6496]=> int(3) 
} 
array(1) { 
    [87]=> int(3) 
} 
array(1) { 
    [36868]=> int(3) 
} 
array(1) { 
    [68]=> int(3) 
} 
array(1) { 
    [9068]=> int(3) 
} 
array(1) { 
    [47]=> int(3) 
}
每个数组中的键是一个用户ID,所以我需要保留它,但我只需要每个键的一个实例,如果有重复的键,则求和这些值。像这样:

array(1) {
    [36868]=> int(6)
}
array(1) {
    [2112]=> int(3)
} 
array(1) { 
    [35901]=> int(3) 
} 
array(1) { 
    [6496]=> int(3) 
} 
array(1) { 
    [87]=> int(3) 
} 
array(1) { 
    [68]=> int(3) 
} 
array(1) { 
    [9068]=> int(3) 
} 
array(1) { 
    [47]=> int(3) 
}
我已尝试在阵列中循环:

foreach ($array as $key => &$value) {
    if ($value[0] == $value[1]) {
        $value[1] += $value[1];
    }
}
但是没有运气。我还尝试过以不同的方式渲染数组,即
[userid]=>1、[score]=>3
,我感觉自己好像在兜圈子,因此非常感谢您的帮助

$data <-- this is your original array

$result = array_reduce(
    $data,
    function($carry, $item) {
        foreach ($item as $id => $score) {
            if (array_key_exists($id, $carry)) {
                $carry[$id] += $score;
            } else {
                $carry[$id] = $score;
            }
        }

        return $carry;
    },
    []
);
您也可以继续使用foreach:

/** foreach to create a $data array like described below and afterwards do this: **/
$result = [];
foreach($data as $row) {
    $score = reset($row);
    $id = key($row);

    if (array_key_exists($id, $result)) {
        $result[$id] += $score;
    } else {
        $result[$id] = $score;
    }
}
这将采用如下数组
$data

array(
    array('1' => 3),
    array('1' => 3),
    array('2' => 3),
);
array(
    '1' => 6,
    '2' => 3,
);
并创建变量
$result
,如下所示:

array(
    array('1' => 3),
    array('1' => 3),
    array('2' => 3),
);
array(
    '1' => 6,
    '2' => 3,
);
您也可以继续使用foreach:

/** foreach to create a $data array like described below and afterwards do this: **/
$result = [];
foreach($data as $row) {
    $score = reset($row);
    $id = key($row);

    if (array_key_exists($id, $result)) {
        $result[$id] += $score;
    } else {
        $result[$id] = $score;
    }
}
这将采用如下数组
$data

array(
    array('1' => 3),
    array('1' => 3),
    array('2' => 3),
);
array(
    '1' => 6,
    '2' => 3,
);
并创建变量
$result
,如下所示:

array(
    array('1' => 3),
    array('1' => 3),
    array('2' => 3),
);
array(
    '1' => 6,
    '2' => 3,
);

这里有一个干净的方法,不会产生通知。合并求和数组数据时,有效的方法是生成临时键并使用非常快速的
isset()
函数。我本可以使用
current()
key()
访问单独的子数组元素,但第二个foreach控制结构实际上更快、更紧凑。(参考: )

代码:()

输出:

array (
  0 => 
  array (
    36868 => 6,
  ),
  1 => 
  array (
    2112 => 3,
  ),
  2 => 
  array (
    35901 => 3,
  ),
  3 => 
  array (
    6496 => 3,
  ),
  4 => 
  array (
    87 => 3,
  ),
  5 => 
  array (
    68 => 3,
  ),
  6 => 
  array (
    9068 => 3,
  ),
  7 => 
  array (
    47 => 3,
  ),
)

这里有一个干净的方法,不会产生通知。合并求和数组数据时,有效的方法是生成临时键并使用非常快速的
isset()
函数。我本可以使用
current()
key()
访问单独的子数组元素,但第二个foreach控制结构实际上更快、更紧凑。(参考: )

代码:()

输出:

array (
  0 => 
  array (
    36868 => 6,
  ),
  1 => 
  array (
    2112 => 3,
  ),
  2 => 
  array (
    35901 => 3,
  ),
  3 => 
  array (
    6496 => 3,
  ),
  4 => 
  array (
    87 => 3,
  ),
  5 => 
  array (
    68 => 3,
  ),
  6 => 
  array (
    9068 => 3,
  ),
  7 => 
  array (
    47 => 3,
  ),
)

您需要有单独的阵列吗?或者它们可以合并?@DavidPassmore它可以合并,我以前也尝试过,但没有那么多运气这样做。你需要单独的数组吗?或者它们可以合并?@DavidPassmore它可以合并,我以前也尝试过,但没有那么幸运。汉克斯·德鲁曼,我尝试过,但我得到的结果是9 x NULL`foreach($key=>$value){$data=array($value['id']=>3);array\u($data,函数($carry,$item){foreach($id=>$score){$carry[$id]+=$score;}返回$carry;},[]);var_dump($carry);}`抱歉,我没有意识到您无法在注释中设置格式:/I更新了示例。您必须从函数中获取最终结果,而不是重用
$carry
。此外,您不需要foreach。只需将原始数组作为第一个参数传入
array\u reduce()
(将
$data
替换为
$results
)我不认为它会将我的$data数组传递到array\u reduce,因为我无法在每行代码的任何一点上转储任何内容来查看它在做什么,它总是空的或空的。我是否应该在其中一点上看不到至少一些数据?我已经将$data=array($value['id']=>3);更改为$data[]=$value['id'];这就解决了我的问题。谢谢你的耐心dbrumann,谢谢你花时间来帮助我!谢谢dbrumann,我已经尝试过了,但是我得到的结果是9 x NULL`foreach($results as$key=>$value){$data=array($value['id']=>3);array\u($data,函数($carry,$item){foreach($id=>$score){$carry[$id]+=$score;}返回$carry;},[]);var_dump($carry);}`抱歉,我没有意识到您无法在注释中设置格式:/I更新了示例。您必须从函数中获取最终结果,而不是重用
$carry
。此外,您不需要foreach。只需将原始数组作为第一个参数传入
array\u reduce()
(将
$data
替换为
$results
)我不认为它会将我的$data数组传递到array\u reduce,因为我无法在每行代码的任何一点上转储任何内容来查看它在做什么,它总是空的或空的。我是否应该在其中一点上看不到至少一些数据?我已经将$data=array($value['id']=>3);更改为$data[]=$value['id'];这就解决了我的问题。谢谢你的耐心和花时间帮我解决这个问题!