Php 将数组中的值转换为另一个多维数组

Php 将数组中的值转换为另一个多维数组,php,multidimensional-array,grouping,array-column,Php,Multidimensional Array,Grouping,Array Column,目前,这是我的代码,但不起作用: //$queryBalance is the array received from an sql select foreach ($queryBalance as $index => $runrows){ $val = $runrows->balance; $val = str_ireplace(".","",$val); $val = str_ireplace(",",".",$val); //echo($i.'

目前,这是我的代码,但不起作用:

//$queryBalance is the array received from an sql select
foreach ($queryBalance as $index => $runrows){ 
    $val = $runrows->balance;
    $val = str_ireplace(".","",$val);
    $val = str_ireplace(",",".",$val);
    //echo($i.' - '.$runrows->id_month.' ; ');
    //$valor = $runrows->id_month == $i ? $val : 'Null';
    if($i > $monthFim){
        $i = $monthInicio-1;
        array_push($balanceArray, $balanceTeste);                     
        echo('('.$i.' - '.$runrows->id_month.'); ');
        //dd('('.$balanceArray.' - '.$balanceTeste.'); ');
    }else{
        array_push($balanceTeste, $valor);
    }
    $i++; 
}
我想转换此输入数组(
$queryBalance
):

在这里(索引名称无关紧要,我把它放在这里是为了举例说明逻辑:

基本上,我希望按年度和月份分组以获得余额

ps:数据将始终按顺序排列

  • 生成唯一年和月组合的数组。
    (*声明为键以确保它们是唯一的)

  • 迭代
    $queryBalance
    直到其为空/用尽。
    (*如果需要重新使用原始
    $queryBalance
    请复制一份。)

  • $queryBalance
    的第一个子数组指定为下一行的变量

  • 如果
    $uniques
    中的预期日期对与
    $first
    日期对相同,则移除第一个子数组(通过
    数组\u shift()
    )并存储余额;否则存储
    NULL
    ,不修改
    $queryBalance

  • $temp
    是一个“批处理”数组。foreach循环完成后,批处理就可以转移到
    $result

  • 代码:()

    输出:

    array (
      0 => 
      array (
        0 => '-257,21',
        1 => '-257,21',
        2 => '-257,21',
        3 => '166,66',
      ),
      1 => 
      array (
        0 => '55',
        1 => NULL,
        2 => '0',
        3 => '55',
      ),
      2 => 
      array (
        0 => '-22257,21',
        1 => '-64609,14',
        2 => '-64609,14',
        3 => '-12234,89',
      ),
    )
    

    我的第二种方法应该更适合你的任务。
    array:3 [
       0 => {
        "balance_month1_year2018": "-257,21"
        "balance_month2_year2018": "-257,21"
      }
      1 => {
        "balance_month1_year2018": "0"
        "balance_month2_year2018": "0"
      }
      2 => {
        "balance_month1_year2018": "-64609,14"
        "balance_month2_year2018": "-64609,14"
      }
    ]
    
    $queryBalance=[
        (object)["balance"=>"-257,21","id_month"=>12,"year"=>"2017"],
        (object)["balance"=>"-257,21","id_month"=>1,"year"=>"2018"],
        (object)["balance"=>"-257,21","id_month"=>2,"year"=>"2018"],
        (object)["balance"=>"166,66","id_month"=>3,"year"=>"2018"],
        (object)["balance"=>"55","id_month"=>12,"year"=>"2017"],
        //(object)["balance"=>"0","id_month"=>1,"year"=>"2018"],
        (object)["balance"=>"0","id_month"=>2,"year"=>"2018"],
        (object)["balance"=>"55","id_month"=>3,"year"=>"2018"],
        (object)["balance"=>"-22257,21","id_month"=>12,"year"=>"2017"],
        (object)["balance"=>"-64609,14","id_month"=>1,"year"=>"2018"],
        (object)["balance"=>"-64609,14","id_month"=>2,"year"=>"2018"],
        (object)["balance"=>"-12234,89","id_month"=>3,"year"=>"2018"]
    ];
    foreach($queryBalance as $row){
        $uniques[$row->year.'-'.$row->id_month]=NULL;  // determine all unique date groups
    }
    
    while($queryBalance){
        $temp=[];
        foreach($uniques as $date=>$null){
            $first=current($queryBalance);  // cache the element that is currently first in $queryBalance
            $temp[]=($date==$first->year.'-'.$first->id_month) ? array_shift($queryBalance)->balance : NULL;  // extract from array, or store NULL without modifying $queryBalance
        }
        $result[]=$temp;
    }
    
    var_export($result);
    
    array (
      0 => 
      array (
        0 => '-257,21',
        1 => '-257,21',
        2 => '-257,21',
        3 => '166,66',
      ),
      1 => 
      array (
        0 => '55',
        1 => NULL,
        2 => '0',
        3 => '55',
      ),
      2 => 
      array (
        0 => '-22257,21',
        1 => '-64609,14',
        2 => '-64609,14',
        3 => '-12234,89',
      ),
    )