Как поправить пользовательскую функцию?
Подскажите, почему не отрабатывает:
function wrAr (array($start) = false, array($val)){
global $xml; // это xmlwriter
if(empty(array_column($val, '1'))) {
return NULL;
}
if (!empty($start)) {
foreach($start as $st) {
return $xml->startElement($st['0']);
}
}
foreach($val as $value) {
if (empty($value)) {
continue;
}
return $xml->writeElement($value['0'], !$value['2'] ? $value['1'] : $value['2'][$value['1']]);
}
$start = array_reverse($start);
foreach($start as $st) {
return $xml->endElement();
}
}
Что я хочу в итоге:
допустим в $video ссылка на какое-то видео:
wrAr(false,['video', $video]);
wrAr(false,[['video', $video],['video', video1]]);
И получить в XML файле:
<videol>https://expamle.com/111111</video>
<videol>https://expamle.com/111111</video>
<videol>https://expamle.com/222222</video>
или
wrAr([videos],[['video', $video],['video', video1]]);
и получить:
<videos>
<videol>https://expamle.com/111111</video>
<videol>https://expamle.com/222222</video>
</videos>
или если есть какой-то справочник:
$book = [ 'red' => 'красный', 'blue' => 'синий'];
$color = 'red';
wrAr(false,['colorist', $color, $book]);
Нужный результат:
<colorist>красный</colorist>
Подскажите, что я сделал не так? Проверка на пустое поле перед записью в XML обязательна.
Ответы (1 шт):
Автор решения: Максим Степанов
→ Ссылка
В основном проблема Вашей функции в том, что используете return не там, где нужно. Конструкция return - если вызывается из функции, немедленно прекращает выполнение текущей функции и возвращает свой аргумент как значение данной функции: документация
Упрощенно Ваша функция должна выглядеть так:
<?php
function wrAr(array $videos, bool $inBox)
{
$xmlWriter = new XMLWriter();
$xmlWriter->openMemory();
// если массив пустой, ошибка и выход из функции:
if (empty($videos)) {
return 'Error: no data for xml';
}
$xmlWriter->startDocument();
// если $inBox = true, добавляем родительский элемент
if ($inBox) {
$xmlWriter->startElement('videos');
}
foreach ($videos as $video) {
$xmlWriter->writeElement($video['tag'], $video['value']);
}
if ($inBox) {
$xmlWriter->endElement();
}
// заполненный $xmlWriter выводим как результат работы функции
return $xmlWriter->outputMemory(true);
}
$videos = [
[
'tag' => 'video1',
'value' => 'https://expamle.com/111111'
],
[
'tag' => 'video2',
'value' => 'https://expamle.com/222222'
]
];
wrAr($videos, true);
// вывод:
/*
<videos>
<video1>https://expamle.com/111111</video1>
<video2>https://expamle.com/222222</video2>
</videos>
*/
wrAr($videos, false);
// вывод:
/*
<video1>https://expamle.com/111111</video1>
<video2>https://expamle.com/222222</video2>
*/