Заполните массив, когда две строки совпадают в двойном цикле foreach - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть 2 PHP-массива, как это:

array (size=12)
  0 => string 'April 2017' (length=10)
  1 => string 'Mei 2017' (length=8)
  2 => string 'Juni 2017' (length=9)
  3 => string 'Juli 2017' (length=9)
  4 => string 'Augustus 2017' (length=13)
  5 => string 'September 2017' (length=14)
  6 => string 'Oktober 2017' (length=12)
  7 => string 'November 2017' (length=13)
  8 => string 'December 2017' (length=13)
  9 => string 'Januari 2018' (length=12)
  10 => string 'Februari 2018' (length=13)
  11 => string 'Maart 2018' (length=10)

array (size=8)
  0 => 
    object(stdClass)[81]
      public 'label' => string 'April 2017' (length=10)
      public 'vacyear' => string '2017' (length=4)
      public 'vacmonth' => string '4' (length=1)
      public 'totalsubscriptions' => string '2' (length=1)
  1 => 
    object(stdClass)[82]
      public 'label' => string 'Oktober 2017' (length=12)
      public 'vacyear' => string '2017' (length=4)
      public 'vacmonth' => string '10' (length=2)
      public 'totalsubscriptions' => string '5' (length=1)
  2 => 
    object(stdClass)[83]
      public 'label' => string 'November 2017' (length=13)
      public 'vacyear' => string '2017' (length=4)
      public 'vacmonth' => string '11' (length=2)
      public 'totalsubscriptions' => string '1' (length=1)
  3 => 
    object(stdClass)[84]
      public 'label' => string 'December 2017' (length=13)
      public 'vacyear' => string '2017' (length=4)
      public 'vacmonth' => string '12' (length=2)
      public 'totalsubscriptions' => string '13' (length=2)
  4 => 
    object(stdClass)[85]
      public 'label' => string 'Januari 2018' (length=12)
      public 'vacyear' => string '2018' (length=4)
      public 'vacmonth' => string '1' (length=1)
      public 'totalsubscriptions' => string '14' (length=2)
  5 => 
    object(stdClass)[86]
      public 'label' => string 'Februari 2018' (length=13)
      public 'vacyear' => string '2018' (length=4)
      public 'vacmonth' => string '2' (length=1)
      public 'totalsubscriptions' => string '31' (length=2)
  6 => 
    object(stdClass)[87]
      public 'label' => string 'Maart 2018' (length=10)
      public 'vacyear' => string '2018' (length=4)
      public 'vacmonth' => string '3' (length=1)
      public 'totalsubscriptions' => string '4' (length=1)
  7 => 
    object(stdClass)[88]
      public 'label' => string 'April 2018' (length=10)
      public 'vacyear' => string '2018' (length=4)
      public 'vacmonth' => string '4' (length=1)
      public 'totalsubscriptions' => string '5' (length=1)

Первый массив - $past12months, и он всегда содержит ровно 12 элементов (каждый месяц в течение последних 12 месяцев).

Второй массив $orgvacssubscrmonth извлекается из mysql и содержит массив объектов с меткой (это соответствует точной записи в массиве $past12months.

Мне нужно объединить эти массивы, чтобы создать результат, который выглядит следующим образом:

array (size=2)
  'months' => 
    array (size=12)
      0 => string 'April 2017' (length=10)
      1 => string 'Mei 2017' (length=8)
      2 => string 'Juni 2017' (length=9)
      3 => string 'Juli 2017' (length=9)
      4 => string 'Augustus 2017' (length=13)
      5 => string 'September 2017' (length=14)
      6 => string 'Oktober 2017' (length=12)
      7 => string 'November 2017' (length=13)
      8 => string 'December 2017' (length=13)
      9 => string 'Januari 2018' (length=12)
      10 => string 'Februari 2018' (length=13)
      11 => string 'Maart 2018' (length=10)
  'amounts' => 
    array (size=12)
      0 => string '2' (length=1)
      1 => int 0
      2 => int 0
      3 => int 0
      4 => int 0
      5 => int 0
      6 => string '5' (length=1)
      7 => string '1' (length=1)
      8 => string '13' (length=2)
      9 => string '14' (length=2)
      10 => string '31' (length=2)
      11 => string '4' (length=1)

Это код, который у меня есть:

foreach ($past12months as $month) {
    if(!in_array($month, $past12monthsfulldata['months'], true)){
        array_push($past12monthsfulldata['months'], $month);
        foreach ($orgvacssubscrmonth as $entry) {
            if ($entry->label == $month) {
                array_push($past12monthsfulldata['amounts'], $entry->totalsubscriptions);
                break;
            } else {
                array_push($past12monthsfulldata['amounts'], 0);
                break;
            }
        }
    }
}

Это создает результат, подобный приведенному ниже (я полагаю, что из-за перерыва, но если я удаляю их, я получаю массив значений, состоящий из элементов 12x6):

array (size=2)
  'months' => 
    array (size=12)
      0 => string 'April 2017' (length=10)
      1 => string 'Mei 2017' (length=8)
      2 => string 'Juni 2017' (length=9)
      3 => string 'Juli 2017' (length=9)
      4 => string 'Augustus 2017' (length=13)
      5 => string 'September 2017' (length=14)
      6 => string 'Oktober 2017' (length=12)
      7 => string 'November 2017' (length=13)
      8 => string 'December 2017' (length=13)
      9 => string 'Januari 2018' (length=12)
      10 => string 'Februari 2018' (length=13)
      11 => string 'Maart 2018' (length=10)
  'amounts' => 
    array (size=12)
      0 => string '2' (length=1)
      1 => int 0
      2 => int 0
      3 => int 0
      4 => int 0
      5 => int 0
      6 => int 0
      7 => int 0
      8 => int 0
      9 => int 0
      10 => int 0
      11 => int 0

1 Ответ

0 голосов
/ 30 апреля 2018

Вы можете просто удалить предложение else, чтобы будущая итерация в цикле могла выполнить желаемую вставку:

foreach ($past12months as $month) {
    if(!in_array($month, $past12monthsfulldata['months'], true)){
        array_push($past12monthsfulldata['months'], $month);
        foreach ($orgvacssubscrmonth as $entry) {
            if ($entry->label == $month) {
                array_push($past12monthsfulldata['amounts'], $entry->totalsubscriptions);
                break;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...