• Как отфильтровать дублирующие поля записей, выгруженные из БД MySQL для построения DOMDocument с целью последующего сохранения в XML-файл?

    @mobcomm Автор вопроса
    VadimFox, добрый день!
    Вы правы - это print_r в конце каждой итерации.
    И хотя я пока не воспользовался предложенным решением (поскольку в нем требуются дополнительные доработки, в частности устранение дублирования по ценам), но в целом, думаю, можно считать Ваше решение ответом на вопрос:
    "То есть цель – сохранить под каждым ID = узел <Товар Код="…" Название="…" >…Товар > весь перечень его цен и свойств, а не дублировать узлы с одинаковым ID (Код). "
    Благодарю Вас за помощь!
    Если будет время доработать предложенное Вами решение под эту задачу - обязательно выложу итоговый результат.

    Со своей стороны доработал свой исходный код - решение получилось не такое элегантное, но в целом рабочее (выложу в исправленном комментарии).
  • Как отфильтровать дублирующие поля записей, выгруженные из БД MySQL для построения DOMDocument с целью последующего сохранения в XML-файл?

    @mobcomm Автор вопроса
    Попытки реализовать проверку на дубли в функции (прошу помочь найти ошибки):

    //Функция проверки элементов на дубли
    //Входные параметры: что проверяем на дубли ($childName), в каком массиве узлов ($ckeckMassive), запись из БД ($row)
    function checkDuplicate(string $childName, $ckeckMassive, $row)
    {
    	foreach ($ckeckMassive->childNodes as $childN) {							//foreach ($elements[$key]->childNodes as $childN)
    									
    		
    		switch ($childN->nodeName) {											//if($childN->nodeName == 'Цена') {
    			case 'Цена':
    				if($childN->getAttribute('Тип') == $row['Тип']) {				//if($childN->getAttribute('Тип') == $row['Тип']) {	(4+)
    					$add = FALSE; //Индикатор записи (если записывали в массив ранее)
    					//break 2;	//выходим из switch и из foreach. 
    					break;	//выходим из switch
    				} else {
    					$add = TRUE;
    				}
    				//break;
    			case 'Свойства':
    				if(array_key_exists('Свойства', $row)) { //array_key_exists ищет ключи только на первом уровне массива. Возвращает true в случае успешного завершения или false в случае возникновения ошибки
    					$add = FALSE; //Индикатор записи (если записывали в массив ранее)
    					//break 2;	//выходим из switch и из foreach. 
    					break;	//выходим из switch
    				} else {
    					$add = TRUE;
    				}
    				//break;
    		}
    	return $add;
    	}
    }
    
    ... //тело программы
            $i++; //увеличиваем индекс
    	}else{		//Если <ТОВАР> есть в массиве записей из БД MySQL ($rows[]) (и, соответственно, есть $key с ключом его ID, а также есть соответствующий в Массиве узлов ($elements[]))
    			
    		//<ЦЕНА> - узел 1 уровня
    		//Результат проверки == FALSE или TRUE
    		$addPrice = checkDuplicate('Цена', $elements[$key], $row);
    		if($addPrice !== FALSE) {
    			addChild2($dom, $elements[$key], 'Цена', $row['Цена'], 'Тип', $row['Тип']); //то записываем в найденный в Массиве узлов ($elements[]) узел <ТОВАР> - новый узел <ЦЕНА>
    		}
    /*
    		if($addProperty === TRUE) {
    			//addChild2($dom, $elements[$key], 'Цена', $rows[$i]['Цена'], 'Тип', $rows[$i]['Тип']); //ТО ЗАПИСЫВАЕМ В НАЙДЕННЫЙ В в МАССИВе УЗЛОВ ($elements[]) узел <ТОВАР> - новый узел <ЦЕНА>
    			//addChild2($dom, $elements[$key], 'Цена', $row['Цена'], 'Тип', $row['Тип']); //ТО ЗАПИСЫВАЕМ В НАЙДЕННЫЙ в МАССИВе УЗЛОВ ($elements[]) узел <ТОВАР> - новый узел <ЦЕНА>
    			$child = addChild2($dom, $elements[$key], 'Свойства');
    		}
    */
    	}
  • Как отфильтровать дублирующие поля записей, выгруженные из БД MySQL для построения DOMDocument с целью последующего сохранения в XML-файл?

    @mobcomm Автор вопроса
    Добрый день!
    Благодарю Вас за подсказку. Идея хорошая привести данные в порядок, но к сожалению так и не удалось с этой реализацией отфильтровать добавляемые поля от дублей. Результат получился следующий:
    Array
    (
        [201] => Array
            (
                [Свойства] => Плотность
                [Раздел] => Бумага
                [Цены] => Array
                    (
                        [0] => Array
                            (
                                [Цена] => 11.50
                                [Тип] => Базовая
                            )
    
                    )
    
            )
    
    )
    Array
    (
        [201] => Array
            (
                [Свойства] => Плотность
                [Раздел] => Бумага
                [Цены] => Array
                    (
                        [0] => Array
                            (
                                [Цена] => 11.50
                                [Тип] => Базовая
                            )
    
                        [1] => Array
                            (
                                [Цена] => 12.50
                                [Тип] => Москва
                            )
    
                    )
    
            )
    
    )
    Array
    (
        [201] => Array
            (
                [Свойства] => Плотность
                [Раздел] => Бумага
                [Цены] => Array
                    (
                        [0] => Array
                            (
                                [Цена] => 11.50
                                [Тип] => Базовая
                            )
    
                        [1] => Array
                            (
                                [Цена] => 12.50
                                [Тип] => Москва
                            )
    
                        [2] => Array
                            (
                                [Цена] => 11.50
                                [Тип] => Базовая
                            )
    
                    )
    
            )
    
    )
    ...


    То есть поля продолжают дублироваться по ID (Коду)