Добрый день!
Я видимо что-то не понимаю.
Вот цитата:
Функции не обязаны быть определены до их использования, исключая тот случай, когда функции определяются условно, как это показано в двух последующих примерах.
Вопрос такой: я в цикле использую функции, которые определяю ниже в коде. На что появляются ошибки в логе, ну и все соответственно ломается.
Если же сначала все объявить, а потом использовать, то работает нормально. Как так?
Привожу код, там есть API битрикса, но не суть:
if($arResult["GRID"]["ROWS"])
{
$tempArr1 = [];
$index = 0;
foreach ($arResult["GRID"]["ROWS"] as $key => $value) {
$only_ID[] = $value['PRODUCT_ID'];
}
// $only_ID = array_column($arResult['ITEMS']['AnDelCanBuy'], 'PRODUCT_ID');
//Для товаров, лежащих в корзине, получим свойство УСТАНОВКА-привязка (ЭЛЕМЕНТЫ)
$CIBlockResult = CIBlockElement::GetList(Array("SORT"=>"ASC"), Array('IBLOCK_ID' => 1, 'ID'=>$only_ID), false, false, Array('IBLOCK_ID', 'ID', 'PROPERTY_ADDITIONAL_USTANOVKA', 'IBLOCK_SECTION_ID'));
while($ob = $CIBlockResult->GetNextElement())
{
$arFields = $ob->GetFields();
$tempArr1[$index]['PROPERTY_ADDITIONAL_USTANOVKA_ID'] = $arFields['PROPERTY_ADDITIONAL_USTANOVKA_VALUE'];
$tempArr1[$index]['IBLOCK_SECTION_ID'] = $arFields['IBLOCK_SECTION_ID'];
$tempArr1[$index]['PRODUCT_ID'] = $only_ID[$index];
$index++;
}
unset($only_ID, $index, $CIBlockResult, $ob, $arFields);
// echo "<pre>";
// var_dump($tempArr1);
// echo "</pre>";
// hasParentSection($tempArr1) - немного неверна логика, будет не срабатывать, если хоть у 1 нет родителя
while (!isFullProperties($tempArr1) && hasParentSection($tempArr1)) {
$onlySectionIDArr = getIDofSection($tempArr1);//ID разделов тех свойств, у которых пустое свойство PROPERTY_ADDITIONAL_USTANOVKA_ID
$LVL1_sectionPropety = getSectionsProperty($onlySectionIDArr);
addSectionsPropertyToArr($tempArr1, $LVL1_sectionPropety);
}
// echo "<pre>";
// var_dump($tempArr1);
// echo "</pre>";
//По свойству-привязке получим значения цены установки
$resultPropertyPrice = getResultPricesByID($tempArr1);
foreach ($tempArr1 as $key => $value) {
foreach ($resultPropertyPrice as $key1 => $value1) {
if ($value['PROPERTY_ADDITIONAL_USTANOVKA_ID'] == $value1['PROPERTY_ADDITIONAL_USTANOVKA_ID']) {
$tempArr1[$key]['PROPERTY_ADDITIONAL_U_PRICE'] = $value1['PROPERTY_ADDITIONAL_U_PRICE'];
}
}
}
//Тут конец - вывод верный
addPriceToOriginalArr($arResult, $tempArr1);
// echo "<pre>";
// var_dump($arResult["GRID"]["ROWS"]);
// echo "</pre>";
unset($tempArr1, $LVL1_sectionPropety);
//Функция проверяет, заполнены ли все значения PROPERTY_ADDITIONAL_USTANOVKA_ID
function isFullProperties($arrWithProperty) {
$flag = true;
foreach ($arrWithProperty as $key => $value) {
if (empty($value['PROPERTY_ADDITIONAL_USTANOVKA_ID'])) {
$flag = false;
}
}
if ($flag) {
return true;
} else {
return false;
}
}
//Функция проверяет, есть ли родители у элементов без PROPERTY_ADDITIONAL_USTANOVKA_ID
function hasParentSection($arrWithProperty) {
$flag = false;
foreach ($arrWithProperty as $key => $value) {
if (empty($value['PROPERTY_ADDITIONAL_USTANOVKA_ID']) && !empty($value['IBLOCK_SECTION_ID'])) {
$flag = true;
}
}
if ($flag) {
return true;
} else {
return false;
}
}
//Функция для получения ID-разделов тех товаров, для которых собственное свойство установки - не заполнено
function getIDofSection($arrWithProperty) {
$only_IBLOCK_SECTION_ID = [];
//Получим IBLOCK_SECTION_ID только тех товаров в корзине, для которых собственное свойство установки - не заполнено
foreach ($arrWithProperty as $key => $value) {
if (empty($value['PROPERTY_ADDITIONAL_USTANOVKA_ID'])) {
$only_IBLOCK_SECTION_ID[] = $value['IBLOCK_SECTION_ID'];
}
}
return $only_IBLOCK_SECTION_ID;
}
//Функция для получения свойства-привязки UF_USTANOVKA
function getSectionsProperty($arrID) {
$index = 0;
$temp = [];
//Получим свойства для тех разделов, элемент которых не имеют собственного заполненного свойства установки
$CIBlockResult = CIBlockSection::GetList(Array("SORT"=>"ASC"), Array('IBLOCK_ID' => 1, 'ID'=>$arrID), false, Array('IBLOCK_ID', 'IBLOCK_SECTION_ID', 'UF_USTANOVKA'), false);
while($ob = $CIBlockResult->GetNextElement())
{
$arFields = $ob->GetFields();
$temp[$index]['SECTION_ID'] = $arrID[$index];
$temp[$index]['UF_USTANOVKA'] = $arFields['UF_USTANOVKA'];
$temp[$index]['IBLOCK_SECTION_ID'] = $arFields['IBLOCK_SECTION_ID'];
$index++;
}
return $temp;
}
//Функция дополним полученными свойствами разделов свойства элементов общего массива $tempArr1
function addSectionsPropertyToArr(&$arrWithProperty, &$section_properies) {
foreach ($arrWithProperty as $key => $value) {
if (empty($value['PROPERTY_ADDITIONAL_USTANOVKA_ID'])) {
foreach ($section_properies as $key1 => $value1) {
if ($value['IBLOCK_SECTION_ID'] == $value1['SECTION_ID']) {
$arrWithProperty[$key]['IBLOCK_SECTION_ID'] = $value1['IBLOCK_SECTION_ID'];
if (!empty($value1['UF_USTANOVKA'])) {
$arrWithProperty[$key]['PROPERTY_ADDITIONAL_USTANOVKA_ID'] = $value1['UF_USTANOVKA'];
}
}
}
}
}
}
//Функция принимает массив ID и выдает цены по этим ID - цены для доп установки
function getResultPricesByID($arrWithProperty) {
$arrID = array_column($arrWithProperty, 'PROPERTY_ADDITIONAL_USTANOVKA_ID');
foreach ($arrID as $key => $value) {
if (empty($value)) {
unset($arrID[$key]);
}
}
$arrIDUnique = array_unique($arrID);
$arrIDUnique = array_values($arrIDUnique);//Перенумеровываем массив с нуля, изначально не так
$index = 0;
$temp = [];
$CIBlockResult = CIBlockElement::GetList(Array("SORT"=>"ASC"), Array('IBLOCK_ID' => 19, 'ID'=>$arrIDUnique), false, false, Array('IBLOCK_ID', 'ID', 'PROPERTY_ADDITIONAL_U_PRICE'));
while($ob = $CIBlockResult->GetNextElement())
{
$arFields = $ob->GetFields();
$temp[$index]['PROPERTY_ADDITIONAL_USTANOVKA_ID'] = $arrIDUnique[$index];
$temp[$index]['PROPERTY_ADDITIONAL_U_PRICE'] = $arFields['PROPERTY_ADDITIONAL_U_PRICE_VALUE'];
$index++;
}
return $temp;
}
//Функция добавляет значение стоимости для каждого элемента
function addPriceToOriginalArr(&$resultArr, $arrWithProperty) {
foreach ($resultArr["GRID"]["ROWS"] as $key => $value) {
foreach ($arrWithProperty as $key1 => $value1) {
if ($value['PRODUCT_ID'] == $value1['PRODUCT_ID']) {
$resultArr["GRID"]["ROWS"][$key]['PROPERTY_ADDITIONAL_U_PRICE'] = $value1['PROPERTY_ADDITIONAL_U_PRICE'];
}
}
}
}
}