Предположим, в переменной $product у нас есть запись товара, и пусть поле $product->channels этой переменной содержит массив со списком разрешенных каналов Яндекс.Маркет для данного товара. То есть массив чисел, где каждое число лежит в диапазоне от 1 до 32. Например:
$product = new stdClass; $product->channels = array(3, 5, 8);
Так как в движке Impera CMS с версии 131021 поле ymarket хранится в базе данных уже как сумма битовых состояний 32 каналов, то вычислить значение этого поля для конкретного товара можем следующим образом, например с помощью математического сложения и оператора возведения в степень pow:
$product->ymarket = 0; foreach ($product->channels as $channel) { $channel--; $product->ymarket += pow(2, $channel); }
То же действие, только с помощью битовых операторов (здесь | - битовое сложение, << - битовое умножение на 2):
$product->ymarket = 0; foreach ($product->channels as $channel) { $channel--; $product->ymarket = $product->ymarket | 1 << $channel; }
Аналогичные вычисления применимы к категориям при вычислении их поля ymarket.