//Функция проверки элементов на дубли
//Входные параметры: что проверяем на дубли ($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], 'Свойства');
}
*/
}
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
[Тип] => Базовая
)
)
)
)
...
Вы правы - это print_r в конце каждой итерации.
И хотя я пока не воспользовался предложенным решением (поскольку в нем требуются дополнительные доработки, в частности устранение дублирования по ценам), но в целом, думаю, можно считать Ваше решение ответом на вопрос:
"То есть цель – сохранить под каждым ID = узел <Товар Код="…" Название="…" >…Товар > весь перечень его цен и свойств, а не дублировать узлы с одинаковым ID (Код). "
Благодарю Вас за помощь!
Если будет время доработать предложенное Вами решение под эту задачу - обязательно выложу итоговый результат.
Со своей стороны доработал свой исходный код - решение получилось не такое элегантное, но в целом рабочее (выложу в исправленном комментарии).