Файл класса myGetBasketData.php 1 или true - всегда возвращается массив. Если результатов нет пустой массив. Если 1 результат массив из одного элемента public $startpos = 0;// номер символа с которого начинается поиск public $startplus = false; // Если задано положительное число(не нуль) то поиск осуществляется в диапазоне с символа $startpos плюс $startplus колличество символов. В данном случаи $endpos никак не учитывается, даже если отличается от false public $endpos = false; // номер символа которым заканчивается поиск public $startrequired = true; // Обязательно наличие начального поискового элемента, за исключением случаев если $start = false public $endrequired = true; // Обязательно наличие конечного поискового элемента, за исключением случаев если $end = false public $requiredifarray = false; // Если значение устанавливается в true когда $startrequired и $endrequired установлены оба в false к массиву результатов будет добавлен кусок строки контента, оставшийся после всех разбиений(фактически мусор). Нужно решить что в этом случаи делать с добавлениями $start и $end в результаты... public $startinclude = false; // true - Включать первый поисковый элемент в результат public $endinclude = false; // true - Включить последний поисковый элемент в результат public $trim = true; // Вырезать пробелы в начале и конце строки всех результатов public $tolose = false; // Если $tolose = true, $start и $end заданы и $endrequired = false то в случаи если $end не найден, дальнейшая разбивка не будет происходить по start. Для rparse зеркально public $content = false; // Хранение объекта для парсинга // При создании функции установки $startpos если устанавливается 0 требуется установить false // Если $startplus <=0 то обязательно установить его в false. Если $startplus не целое стоит сделать его целым // Если $start устанавливается в "" считаь $start = false // Если $end устанавливается в "" считаь $end = false // Если $moreone устанавливаенся в false установить в 0, если true, то установить в 1 public function returncontent ($content="") { // вернуть или массив или строку или false в зависимости от результатов и настроек return $content; } public function moreone($flag=nil) { if ($flag === nil) { return $this->moreone; } elseif(($flag === true) or ($flag == 1)) { $this->moreone = true; } elseif(($flag === false) or ($flag === 0)) { $this->moreone = false; } elseif (is_numeric($flag) and ($flag > 1)) { $this->moreone = $flag * 1; } else { return false; } return true; } public function strposTL($content="",$search="") { if ($this->tolower) { $content = strtolower($content); $search = strtolower($search); } return strpos($content,$search); } public function trim($flag=nil){ if ($flag === nil) { return $this->trim; } elseif($flag) { $this->trim = true; } else { $this->trim = false; } return true; } public function tolose($flag=nil) { if ($flag === nil) { return $this->tolose; } elseif($flag) { $this->tolose = true; } else { $this->tolose = false; } return true; } public function result($result="",$start="",$end="",$startyes=false,$endyes=false) {// вставляет начальные и конечные элементы в результат, а так же обрезает пробелы если это нужно if ($this->trim) { $result = trim($result); } if ($startyes and $this->startinclude) { $result = $start . $result; } if ($endyes and $this->endinclude) { $result = $result . $end; } return $result; } public function results($results=array(),$end=false) { // Тестовая штука для $this->tolose Предназначена когда $end=false и $this->tolose=true всегда возвращался один результат не зависимо от остальных настроек. Если убрать эту функцию то передавать ззначение $end в эту функцию не надо if ($this->tolose and !$end) { if (count($results)) { return $results[0]; } } // Тестовая штука закончилась if ($this->moreone == 0) { if (count($results)) { return $results[0]; } else { return false; } } return $results; } public function string() { // Вернуть контент объекта в формате string return $this->content; } public function a($content=false,$start=false,$end=false) { $results = array(); if (($content !== false) and ($content !== "")) { if (($this->startplus === false) and ($this->endpos !== false) and ($this->endpos < (strlen($content) - 1))) { $content = substr($content,0,($this->endpos+1)); } if ($this->startpos !== false) { if ($this->startpos <= (strlen($content) - 1)) { if ($this->startplus !== false) { $content = substr($content,$this->startpos,$this->startplus); } else { $content = substr($content,$this->startpos); } } else { $content = ""; } } if ($content != "") { $i = 0; do { $goodflag = false; $start2 = ""; // Реальный начальный элемент поиска из контента для подстановки с учётом регистра $end2 = ""; // Конечный элемент, аналогично $start2 if ($start !== false) { if (($pos = $this->strposTL($content,$start)) !== false) { $start2 = substr($content,$pos,strlen($start)); $content = substr($content,$pos+strlen($start)); $goodflag = true; } elseif ($this->startrequired) { break; // вернуть результаты что контента нет } } if ($end !== false) { if (($pos = $this->strposTL($content,$end)) !== false) { $end2 = substr($content,$pos,strlen($end)); $results[] = $this->result(substr($content,0,$pos),$start2,$end2,$goodflag,true); $content = substr($content,$pos+strlen($end)); $goodflag = true; } elseif ($this->endrequired) { break; } else { if ($goodflag) { if ((($pos = $this->strposTL($content,$start)) !== false) and !$this->tolose) { $results[] = $this->result(substr($content,0,$pos),$start2,$end2,$goodflag,false); } else { $results[] = $this->result($content,$start2,$end2,$goodflag,false); } } } } else { if ($goodflag) { if ((($pos = $this->strposTL($content,$start)) !== false) and !$this->tolose) { $results[] = $this->result(substr($content,0,$pos),$start2,$end2,$goodflag,false); } else { $results[] = $this->result($content,$start2,$end2,$goodflag,false); } } } if (!$goodflag) { if (!count($results) or $this->requiredifarray) { $results[] = $this->result($content,$start2,$end2,false,false); } break; } $i++; } while (($this->moreone == 1) or (($this->moreone > 1) and ($this->moreone > $i))); } } return $this->results($results,$end); } public function __toString() { return ($this->content . ""); } public function val() { return $this->content; } public function __construct($content = "") { $this->content = $content; return $this; } public function parse($start=false,$end=false) { $content = $this->content; $results = $this->a($content,$start,$end); $results2 = false; if (is_array($results)) { $results2 = array(); foreach ($results as $v) { $results2[] = new textparser2($v); } } else { $results2 = new textparser2($results); } return $results2; } } class myGetBasketData { static $productCost = 0;// Стоимость всех товаров без скидки корзины(но с учётом акций на товары и группы) static $productCostDiscont = 0;// Стоимость товаров с учётом скидки корзины(от объёма товаров по цене) static $costDiscont = 0;// Размер скидки в рублях static $Discont = 0;// Процент скидки static $discontAr = array();// Массив с скидками static $flagQueryToDB = true;// Необходимость выполнения запроса после создания объекта: true - выполнить; false - не выполнять static $productCount = 0;// Колличество товаров в корзине static $weight = 0;// Вес static $packingsOptionsCDEK = array();// Информация о местах(размеры и вес каждого места) public function __construct() { if (self::$flagQueryToDB) { self::update(); } } public function update() { $return = false; self::$packingsOptionsCDEK = array();// Обновляем информацию о местах для СДЭК if (CModule::IncludeModule("sale") and CModule::IncludeModule("catalog")) {// Подключаем нужный модуль не смотря на то что выше он подключен, поскольку мало ли код выше нужно будет убрать $return = true; // Получаем список товаров в корзине и их цены $arBasketItems = array(); $dbBasketItems = CSaleBasket::GetList(//Выполняем запрос array("NAME" => "ASC","ID" => "ASC"), array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"), false, false, array("ID","MODULE","PRODUCT_ID","QUANTITY","CAN_BUY","PRICE","WEIGHT","LENGTH","WIDTH","HEIGHT")); while ($arItems=$dbBasketItems->Fetch()) {// Просматриваем полученную информацию считаем общее количество и сумму $arItems=CSaleBasket::GetByID($arItems["ID"]); self::$productCount+=$arItems["QUANTITY"]; self::$productCost+=$arItems["PRICE"]*$arItems["QUANTITY"]; self::$weight += $arItems["WEIGHT"]*$arItems["QUANTITY"]; // Далее рассчитываются места для СДЭК $weightOne = 3;// Если вес не задан будет 3 кг if (isset($arItems["WEIGHT"]) and $arItems["WEIGHT"]) { $weightOne = ceil($arItems["WEIGHT"]/1000); } $prodItem = CCatalogProduct::GetByID($arItems["PRODUCT_ID"]); for ($i=1;$i<=$arItems["QUANTITY"];$i++) { if (isset($prodItem["LENGTH"]) and $prodItem["LENGTH"] and isset($prodItem["WIDTH"]) and $prodItem["WIDTH"] and isset($prodItem["HEIGHT"]) and $prodItem["HEIGHT"]) { self::$packingsOptionsCDEK[] = array("weight"=>$weightOne,"length"=>(ceil($prodItem["LENGTH"]/10) . ""),"width"=>(ceil($prodItem["WIDTH"]/10) . ""),"height"=>(ceil($prodItem["HEIGHT"]/10) . "")); } else { self::$packingsOptionsCDEK[] = array("weight"=>$weightOne,"length"=>(70 . ""),"width"=>(50 . ""),"height"=>(48 . "")); } } // Конец расчёта мест для СДЭК } // Получаем список скидок действующих на корзину при достижении стоимости товара определённого уровня $discountObj = CSaleDiscount::GetByID(2);// Передаём Ид скидок $text = new textparser2($discountObj["APPLICATION"]); $text->moreone(true); $items = $text->parse("&& \$row['PRICE']","),"); foreach ($items as $item) { $item->moreone(false); $cost = $item->parse(">= ",")")->val(); $discont = $item->parse("'VALUE' => -",",")->val(); $discontfloor = floor($discont); $costceil = ceil($cost); self::$discontAr[] = array("cost"=>$cost,"discont"=>$discont,"discontfloor"=>$discontfloor,"costceil"=>$costceil); } // применяем скидки, рассчитываем стоимость с скидкой если необходимо, так же вычисляем величину скидки устанавливаем действующий процент скидки $maxSum = 0;// Действующая стоимость скидки $nowDiscount = 0;// Действующий процент скидки foreach (self::$discontAr as $oneDiscount) { if ((self::$productCost >= $oneDiscount["cost"]) and ($oneDiscount["cost"] > $maxSum)) { $maxSum = $oneDiscount["cost"]; $nowDiscount = $oneDiscount["discont"]; } } self::$Discont = $nowDiscount; self::$productCostDiscont = self::$productCost * (1 - (self::$Discont / 100)); self::$costDiscont = self::$productCost - self::$productCostDiscont; } self::$flagQueryToDB = false; return $return; } public function getProductIdDiscontAr() {// Вернуть массив Id товаров с скидкой $prodIdAr = array(); if (CModule::IncludeModule("sale")) { $dbProductDiscounts = CSaleDiscount::GetList(// Запрашиваем все типы скидок array("SORT" => "ASC"), array( ), false, false, array( "ID", "SITE_ID", "ACTIVE", "ACTIVE_FROM", "ACTIVE_TO", "RENEWAL", "NAME", "SORT", "MAX_DISCOUNT", "VALUE_TYPE", "VALUE", "CURRENCY", "PRODUCT_ID" ) ); while ($arProductDiscounts = $dbProductDiscounts->Fetch()) {// В цикле обрабатываем скидки, ищем те которые распространяются на Id товаров и эти Id товаров пишем в массив $discountObj = CSaleDiscount::GetByID($arProductDiscounts["ID"]); if (isset($discountObj["CONDITIONS"]) and $discountObj["CONDITIONS"]) { $ArProdSerialize = $discountObj["CONDITIONS"]; $text = new textparser2($ArProdSerialize); $text->moreone(false); $text = $text->parse("Equal\";s:5:\"value\";a:","}"); $text->moreone(true); $text = $text->parse("i:",";"); $binary = true; foreach ($text as $textItem) { if ($binary) {$binary = false;} else {$binary = true;} if ($binary) { $id = $textItem->val(); if (!in_array($id,$prodIdAr)) { $prodIdAr[] = $id; } } } } } } sort($prodIdAr);// Сортируем массив Id товаров по возрастанию return $prodIdAr; } public function getProductCost() { return self::$productCost; } public function getProductCostCeil() { return ceil(self::$productCost); } public function getProductCount() { return self::$productCount; } public function getProductCostDiscont() { return self::$productCostDiscont; } public function getProductCostDiscontCeil() { return ceil(self::$productCostDiscont); } public function getCostDiscont() { return self::$costDiscont; } public function getCostDiscontFloor() { return floor(self::$costDiscont); } public function getDiscont() { return self::$Discont; } public function getDiscontFloor() { return floor(self::$Discont); } public function getDiscontAr() { return self::$discontAr; } public function getWeight() { return self::$weight; } public function getPackingsOptionsCDEK() { return self::$packingsOptionsCDEK; } }