Php 在数组中某个点之前,如何基于同一个键获取值的和?

Php 在数组中某个点之前,如何基于同一个键获取值的和?,php,arrays,multidimensional-array,sum,Php,Arrays,Multidimensional Array,Sum,我有一个数组,如下所示。我根据键“attack”的值对该数组进行排序。在那之前一切都正常,但我想得到的是,例如,总共只有9个攻击值被求和:我想求和键1中的3个(3*45),键3中的4个(4*35)和键2中的2个(2*25)被自动求和。如果有人帮忙,我将不胜感激 以下是阵列: $data = array( '1' => array('id' => '1', 'attack' => '45', 'defence' => '15', 'total' => '3'), '2

我有一个数组,如下所示。我根据键“attack”的值对该数组进行排序。在那之前一切都正常,但我想得到的是,例如,总共只有9个攻击值被求和:我想求和键1中的3个(3*45),键3中的4个(4*35)和键2中的2个(2*25)被自动求和。如果有人帮忙,我将不胜感激

以下是阵列:

$data = array(
'1' => array('id' => '1', 'attack' => '45', 'defence' => '15', 'total' => '3'),
'2' => array('id' => '2', 'attack' => '25', 'defence' => '15', 'total' => '6'),
'3' => array('id' => '3', 'attack' => '35', 'defence' => '15', 'total' => '4'),
'4' => array('id' => '4', 'attack' => '20', 'defence' => '10', 'total' => '4')

))

以下是我的示例实现:

$data = array(
'1' => array('id' => '1', 'attack' => '45', 'defence' => '15', 'total' => '3'),
'2' => array('id' => '2', 'attack' => '25', 'defence' => '15', 'total' => '6'),
'3' => array('id' => '3', 'attack' => '35', 'defence' => '15', 'total' => '4'),
'4' => array('id' => '4', 'attack' => '20', 'defence' => '10', 'total' => '4')
);

usort($data, 'sort_by_attack');

$attacks_amount = 9;
$sum = 0;

$row = current($data);

while ($attacks_amount > 0) {
        $attacks_amount -= $row['total'];
        $take = $row['total'];

        if ($attacks_amount < 0) {
                $take += $attacks_amount;
        }

        $sum += $take * $row['attack'];

        $row = next($data);
        if (!$row) break;
}

var_dump($sum);

function sort_by_attack($a, $b)
{
        return $a['attack'] > $b['attack'] ? -1 : 1;
}
$data=array(
“1”=>数组(“id”=>“1”,“攻击”=>“45”,“防御”=>“15”,“总数”=>“3”),
“2'=>数组('id'=>'2','attack'=>'25','defence'=>'15','total'=>'6'),
“3”=>数组(“id”=>“3”,“攻击”=>“35”,“防御”=>“15”,“总数”=>“4”),
“4'=>数组('id'=>'4','attack'=>'20','defence'=>'10','total'=>'4')
);
usort($data,'sort_by_attack');
$U金额=9;
$sum=0;
$row=当前($data);
而($attacks\u amount>0){
$attacks_amount-=$row['total'];
$take=$row['total'];
如果($U金额<0){
$take+=$attacks\u数量;
}
$sum+=$take*$row['attack'];
$row=下一个($data);
如果(!$行)中断;
}
var_dump(金额);
函数逐个排序攻击($a,$b)
{
返回$a['attack']>$b['attack']?-1:1;
}

我知道如何手动操作。问题是每次限制都会不同,我想在循环中进行。谢谢你的回答,这真的很有帮助,但我忘了声明限制是数组中的总量,而不是攻击量。这就是我想要的,很抱歉耽误了你的时间。@Chris Ford:我不能理解你的意思。根据你的评论纠正你最初的问题。你写的第一个解决方案不是我想要的,但那一个解决了问题。谢谢你的回答。
$data = array(
'1' => array('id' => '1', 'attack' => '45', 'defence' => '15', 'total' => '3'),
'2' => array('id' => '2', 'attack' => '25', 'defence' => '15', 'total' => '6'),
'3' => array('id' => '3', 'attack' => '35', 'defence' => '15', 'total' => '4'),
'4' => array('id' => '4', 'attack' => '20', 'defence' => '10', 'total' => '4')
);

usort($data, 'sort_by_attack');

$attacks_amount = 9;
$sum = 0;

$row = current($data);

while ($attacks_amount > 0) {
        $attacks_amount -= $row['total'];
        $take = $row['total'];

        if ($attacks_amount < 0) {
                $take += $attacks_amount;
        }

        $sum += $take * $row['attack'];

        $row = next($data);
        if (!$row) break;
}

var_dump($sum);

function sort_by_attack($a, $b)
{
        return $a['attack'] > $b['attack'] ? -1 : 1;
}