为了账号安全,请及时绑定邮箱和手机立即绑定

用不同的键总结多个数组

用不同的键总结多个数组

PHP
12345678_0001 2021-08-28 19:31:49
我一直在尝试总结多个数组的值,但没有成功。我觉得我的大脑受不了了,因此我需要一些帮助或提示。这是我迄今为止最好的:$bani= array();$iduri=array();$total=0;foreach($qp as $luna) {    $nsd_id=$luna['nsd_id'];  // different ids every foreach    $nsd_amount=$luna['nsd_amount']; // different values every foreach    $nsd_id=explode("@",$nsd_id); // this makes them arrays   $nsd_amount=explode("@",$nsd_amount); // same , it makes them arrays    $iduri=array_merge($iduri,$nsd_id); // i tried getting making an array of all the ids it finds    for($x=0;$x<count($iduri);$x++){            $bani[$iduri[$x]] += intval($nsd_amount[$iduri[$x]]);            $total += intval($nsd_amount[$x]);        }}$iduri=array_unique($iduri,SORT_REGULAR);print_r($iduri);我试过为它找到的每个 ID 创建一个数组,然后根据它的位置,将它与数组相加。它确实总结了一些东西,但我没有得到正确的值以及大量未定义的偏移量。我觉得有比这更简单的方法,我真的很感激一些建议。如果结果可能是以下数组,我将不胜感激:Array ( [1] => 0 [2] => 2500[3] => 62000 [4] => etc [5] => etc [12] => etc [14] => etc )(id-s 作为键,汇总值作为对应 id 的值)qp 的 var_exportMysqli_result::__set_state(Array( 'Current_field' => NULL, 'Field_count' => NULL, 'Lengths' => NULL, 'Num_rows' => NULL, 'Type' => NULL, ))foreach 中 $value 的 var_export(部分)Array ( 'Id' => '329', 'Month' => 'May', 'Year' => '2019', 'Empid' => '124', 'Addedby' => 'PMSCLT10002', 'Nsd_id' => '1@2@3@4@5@12@14@15', 'Nsd_amount' => '0@0@0@0@0@0@4000@0', )Array ( 'Id' => '303', 'Month' => 'April', 'Year' => '2019', 'Empid' => '124', 'Addedby' => 'PMSCLT10002', 'Nsd_id' => '1@2@3@4@5@12@14@15', 'Nsd_amount' => '0@0@2000@0@0@500@0@0', ).. 等等
查看完整描述

2 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

这是你可以做的片段,


$nsdIds = [];

$result = [];

foreach ($qp as $key => $value) {

    // exploding Nsd_ids

    $nsdTemp = explode("@", $value['Nsd_id']);

    // exploding nsd_amounts

    $nsdAmount = explode("@", $value['Nsd_amount']);

    // saving all new nsd ids and only keep unique nsd ids

    $nsdIds = array_unique(array_merge($nsdIds, $nsdTemp));

    // I am now combining keeping nsd id as key and nsd amount as its value

    $temp1 = array_combine($nsdTemp, $nsdAmount);


    foreach ($nsdIds as $value1) {

        // for latest php version

        // $temp1 contains keys of nsd ids

        //  value1 contains nsdids we are sure that it will be in nsdids as we are already merging those ids

        //  then fetching amounf for that nsdids

        //$result[$value1] = ($result[$value1] ?? 0) + $temp1[$value1];

        // for php version less than 7

        $result[$value1] = (!empty($result[$value1]) ? $result[$value1] : 0) +  

                            (!empty($temp1[$value1]) ? $temp1[$value1] : 0);

    }

}

print_r($result);die;

演示为PHP 7演示为<PHP 7


查看完整回答
反对 回复 2021-08-28
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

只要nsd_id和nsd_amount在同一行中具有相同数量的值,@那么这应该可以工作。如果没有,那么您需要isset检查$nsd_amount[$key]:


foreach($qp as $luna) {

    $nsd_id = explode("@", $luna['nsd_id']);

    $nsd_amount = explode("@", $luna['nsd_amount']);


    foreach($nsd_id as $key => $id) {

        if(isset($result[$id])) {

            $result[$id] += $nsd_amount[$key];

        } else {

            $result[$id]  = $nsd_amount[$key];

        }

    }   

}


查看完整回答
反对 回复 2021-08-28
  • 2 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信