Как поправить пользовательскую функцию?

Подскажите, почему не отрабатывает:

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>
*/
→ Ссылка