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

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

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

    function getIDofSection($arrWithProperty) {}
}


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


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

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

Похожие вопросы