Правильна ли моя логика модуля для этого цикла? - PullRequest
3 голосов
/ 10 мая 2011

Так вот образец, который я ищу

из конечного набора я хочу получить первые 2 значения для одного набора, затем следующие 4 для другого набора, затем 2 для этого первого набора, затем 4 для другого набора и так далее. .

захват 2 | захватить 4 | захватить 2 | захватить 4 ...

$count = 0;
foreach ($listing as $entry){
  if ($count % 4 == 0){
       // add to 4-item set
  } else if ($count % 2 == 0){
       // add to 2-item set
  }
  $count++;
}

Моя путаница заключается в том, что когда $ count% 4 = 0, то $ count% 2 также будет = 0.

Так что я должен быть в безопасности, не дойдя до неверного случая модуля (поскольку оба верны для любого произвольного числа, кратного 4), проверив first if $ count% 4 == 0?

Ответы [ 3 ]

1 голос
/ 10 мая 2011

Если я правильно понял, ваш желаемый дистрибутив на самом деле:

A A, B B B B, A A, B B B B, A A, B B B B, ...

Итак, вы хотите сгруппировать их в шесть , а затем выбрать первые два в греться А, остальные четыре в B:

if ($count % 6 < 2){
   // add to 2-item set
}
elseif ($count % 6 < 6){
   // add to 4-item set
}

Разделение его на if / elseif гарантирует, что элементы окажутся только в одном из них. Сравнение < n в распределении % 6 будет означать:

$count % 6 =    0  1  2  3  4  5  0
        if =   <2 <2 <6 <6 <6 <6 <2
    basket =    A  A  B  B  B  B  A
1 голос
/ 10 мая 2011

Не правильно

Вы должны установить 1, когда счетчик равен 2, 8, 14 и т. Д.

В настоящее время вы захватываете, когда счетчик составляет 2, 4, 8 и т. Д.

И установить 2, когда счетчик равен 6, 12, 18 и т. Д.

В настоящее время это число равно 4, 8, 12 и т. Д.

Итак, условие 1 равно ((count-2) % 6) == 0

А условие 2 равно (count != 0) && (count % 6) == 0

Вот то, что должно работать

$count = 0;
foreach ($listing as $entry){
  if ($count < 2){
       // add to 2-item set
  } else {
       // add to 4-item set
  }

  if ($count < 6) $count++; 
  else $count = 0;
}

Или, если вы хотите получить 2/4 предмета одновременно:

$count = 0;
foreach ($listing as $entry){
  if ($count == 2){
       // add 2 items to 2-item set
  } elseif ($count == 6) {
       // add 4 items to 4-item set
  }

  if ($count < 6) $count++; 
  else $count = 0;
}
0 голосов
/ 10 мая 2011

Это не сработает по точной причине, которую вы указали.

Способы, которыми это может быть выполнено:

  1. Используйте модуль по 6, а затемвремя его модуля 6, добавьте первые два элемента, начиная с count - 6 до set1, а следующие 4 до set2.
  2. Используйте логический переключатель, когда переключатель true, добавьте элементы в набор 1, после4 элемента устанавливают переключатель в положение false, а когда переключатель имеет значение false, добавляют элементы в set2, переключая значение переключателя, когда вы закончите добавление элементов в set2.
...