Задать вопрос
Martovitskiy
@Martovitskiy

Как правильно использовать array_merge_recursive в данном случае?

Задача, склеить массивы с одинаковыми ключами
Есть массивы:
array(2) {
  [0]=>
  object(stdClass)#43 (5) {
    ["x"]=>
    string(4) "2019"
    ["count_all_sales"]=>
    int(3833)
    ["count_not_pay"]=>
    int(813)
    ["count_paid"]=>
    int(2760)
    ["count_canceled"]=>
    int(260)
  }
  [1]=>
  object(stdClass)#44 (5) {
    ["x"]=>
    string(4) "2020"
    ["count_all_sales"]=>
    int(8218)
    ["count_not_pay"]=>
    int(3183)
    ["count_paid"]=>
    int(4941)
    ["count_canceled"]=>
    int(94)
  }
}
array(1) {
  [0]=>
  object(stdClass)#45 (5) {
    ["x"]=>
    string(4) "2020"
    ["count_all_sales"]=>
    int(9)
    ["count_not_pay"]=>
    int(9)
    ["count_paid"]=>
    int(0)
    ["count_canceled"]=>
    int(0)
  }
}
array(2) {
  [0]=>
  object(stdClass)#46 (5) {
    ["x"]=>
    string(4) "2019"
    ["count_all_sales"]=>
    int(10)
    ["count_not_pay"]=>
    int(10)
    ["count_paid"]=>
    int(0)
    ["count_canceled"]=>
    int(0)
  }
  [1]=>
  object(stdClass)#47 (5) {
    ["x"]=>
    string(4) "2020"
    ["count_all_sales"]=>
    int(27)
    ["count_not_pay"]=>
    int(27)
    ["count_paid"]=>
    int(0)
    ["count_canceled"]=>
    int(0)
  }
}
array(1) {
  [0]=>
  object(stdClass)#48 (5) {
    ["x"]=>
    string(4) "2020"
    ["count_all_sales"]=>
    int(1736)
    ["count_not_pay"]=>
    int(1729)
    ["count_paid"]=>
    int(7)
    ["count_canceled"]=>
    int(0)
  }
}


При использовании array_merge_recursive
$result_orders = array_merge_recursive($result_orders_vzr, $result_tickets, $result_cards, $result_property);

выводит все массивы и не склеивает.
Как мне на выходе получить 2 массива ?
array(2) {
  [0]=>
  object(stdClass)#43 (5) {
    ["x"]=>
    string(4) "2019"
    ["count_all_sales"]=>
    int(3833)
    ["count_not_pay"]=>
    int(813)
    ["count_paid"]=>
    int(2760)
    ["count_canceled"]=>
    int(260)
  }
  [1]=>
  object(stdClass)#44 (5) {
    ["x"]=>
    string(4) "2020"
    ["count_all_sales"]=>
    int(8220)
    ["count_not_pay"]=>
    int(3185)
    ["count_paid"]=>
    int(4940)
    ["count_canceled"]=>
    int(95)
  }
}

но с общим количеством значений?
  • Вопрос задан
  • 71 просмотр
Подписаться 1 Простой 4 комментария
Решения вопроса 1
Martovitskiy
@Martovitskiy Автор вопроса
сделал функцию

function combineAttributes($input) {
            $result = [];
            foreach ($input as $value) {
                if (!array_key_exists($value['x'], $result)) {
                    $result[$value['x']] = $value;
                    continue;
                }
                $item = &$result[$value['x']];
                if (is_array($item['count_all_sales'])) {
                    $item['count_all_sales'][] = $value['count_all_sales'];
                } else {
                    $item['count_all_sales'] += $value['count_all_sales'];
                }
                if (is_array($item['count_not_pay'])) {
                    $item['count_not_pay'][] = $value['count_not_pay'];
                } else {
                    $item['count_not_pay'] += $value['count_not_pay'];
                }
                if (is_array($item['count_paid'])) {
                    $item['count_paid'][] = $value['count_paid'];
                } else {
                    $item['count_paid'] += $value['count_paid'];
                }
                if (is_array($item['count_canceled'])) {
                    $item['count_canceled'][] = $value['count_canceled'];
                } else {
                    $item['count_canceled'] += $value['count_canceled'];
                }
            }
            return array_values($result);
        }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы