@Shv_sergey

Почему функция в php не найдена?

Добрый день!

Я видимо что-то не понимаю.
Вот цитата:
Функции не обязаны быть определены до их использования, исключая тот случай, когда функции определяются условно, как это показано в двух последующих примерах.


Вопрос такой: я в цикле использую функции, которые определяю ниже в коде. На что появляются ошибки в логе, ну и все соответственно ломается.
5b92144722c18860558425.png
Если же сначала все объявить, а потом использовать, то работает нормально. Как так?

Привожу код, там есть 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'];
				}
			}
		}
	}
}
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Так вы же сами процитировали:
Функции не обязаны быть определены до их использования, исключая тот случай, когда функции определяются условно, как это показано в двух последующих примерах.

Это именно ваш случай, функции определяются в блоке if, а значит должны быть определены до вызова.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
исключая тот случай, когда функции определяются условно

if($arResult["GRID"]["ROWS"])
{
    ...

    function getIDofSection($arrWithProperty) {}
}


В документации приведены примеры, упомянутые в вашей цитате. И там есть вот такие слова:
echo "Я не существую до тех пор, пока выполнение программы меня не достигнет.\n";


Это значит, что функция, объявленная внутри условия, не создастся до тех пор, пока интерпретатор до неё не дойдёт, и использовать её выше до объявления, даже внутри этого самого условия, нельзя.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽