@john_ricko

Не могу сложить значения одного массива по ключам?

Всем доброго времени суток.
Делаю приложение на Yii2, в модели есть функция, которая выбирает два поля из базы за определенное время и возвращает массив.
На OpenServer все работает, но при загрузке на ВПС вылазит ошибка Undefined offset 1, как я понял это из за операции сложения +=
$min = $this->find()->select(['plus','DATE_FORMAT(FROM_UNIXTIME(`date_op`), \'%d.%m.%Y\') as date_op'])->where(['user_id' => yii::$app->user->getId()])->andWhere(['between','date_op', $min, $max + 3600 *24])->orderBy('date_op')->asArray()->all();
 foreach($min as $k) {

            //Функция сложения дат и доходов
            $new[(int) $k['date_op']] += $k['plus'];
            
        }

Убираю плюс - работает, но значения за день не складываются
  • Вопрос задан
  • 348 просмотров
Решения вопроса 1
Keanor
@Keanor
Ведущий разработчик
Проще sql поправить: Добавьте SUM на plus и группировку по дате, и ненужно будет в php ничего складывать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
DirecTwiX
@DirecTwiX
"display: flex;" уже предлагали?
$ind = (int) $k['date_op'];
if (!$new[$ind]) $new[$ind] = 0;
$new[$ind] += $k['plus'];
Ответ написан
Комментировать
@john_ricko Автор вопроса
Спасибо всем.
Решение такое:
public function getMaxMonth($min,$max)
    {
        //$min = $this->find()->select(['plus','date_op'])->where(['user_id' => yii::$app->user->getId()])->andWhere(['between','date_op', $min, $max + 3600 *24])->asArray()->all();
        $min = $this->find()->select(['SUM(plus) as plus','DATE_FORMAT(FROM_UNIXTIME(`date_op`), \'%d.%m.%Y\') as date_op'])->where(['user_id' => yii::$app->user->getId()])->andWhere(['between','date_op', $min, $max + 3600 *24])->orderBy('date_op')->groupBy('date_op')->asArray()->all();
        $new = [];
        foreach($min as $k) {

            //Функция сложения дат и доходов
            $new[(int) $k['date_op']] = $k['plus'];
            //$new[(int) date('d',$k['date_op'])] += $k['plus'];
        }
      //  $diff = Enum::dateList(1,31);
        $newdiff = [];
//        foreach($diff as $key => $value) {
//            $newdiff[$key] += 0;
//        }
        for($i = 1; $i<32; $i++) {
            $newdiff[$i] = 0;
        }
        $new = ArrayHelper::merge($new,$newdiff);
  
        return $new;
    }

Функция выводит сумму колонок Plus за месяц по числам, если значения на число нет, то 0, а теперь не могу за год сделать выборку, с += было проще,

public function getMaxYear()
    {
        $now = date('m',time());
        $startyear = strtotime(date("Y-1-1"));
        $year = [];
        for($i = 1; $i < $now + 1; $i++) {
            $diff = $this->getMaxMonth(strtotime(date("Y-$i-1")),strtotime(date("Y-$i-31")));
            foreach($diff as $k)
            {
                $year[$i] += $k;
            }

        }
        return $year;
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы