Преобразовать значения в массиве в другой многомерный массив

В настоящее время это мой код, но он не работает:

//$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):

array:6 [
   0 => {
    "balance": "-257,21"
    "id_month": 1
    "year": "2018"
  }
  1 => {
    "balance": "-257,21"
    "id_month": 2
    "year": "2018"
  }
  2 => {
    "balance": "0"
    "id_month": 1
    "year": "2018"
  }
  3 => {
    "balance": "0"
    "id_month": 2
    "year": "2018"
  }
  4 => {
    "balance": "-64609,14"
    "id_month": 1
    "year": "2018"
  }
  5 => {
    "balance": "-64609,14"
    "id_month": 2
    "year": "2018"
  }
]

в это (имя индексов не имеет значения, я положил его там, чтобы проиллюстрировать логику):

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"
  }
]

По сути, я хочу, чтобы по годам и месяцам группа получала баланс.

ps: данные всегда будут упорядочены

1 ответ

Решение
  1. Создайте массив уникальных комбинаций года и месяца.
    (* Объявите как ключи, чтобы гарантировать, что они уникальны).

  2. повторять $queryBalance пока не опустошен / не исчерпан.
    (* Если вам нужно повторно использовать оригинал $queryBalance сделать копию.)

  3. Назначьте первый подмассив $queryBalance в качестве переменной для следующей строки.

  4. Если ожидается дата пары из $uniques такой же как $first пара дат, удалить первый подмассив (через array_shift()) и хранить баланс; иначе хранить NULL и не модифицируйте $queryBalance,

  5. $temp является "пакетным" массивом Когда цикл foreach закончен, партия готова к передаче $result,

Код: ( Демо)

$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',
  ),
)
Другие вопросы по тегам