• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/lib/imap.php
  • Класс: BitrixMailImap
  • Вызов: Imap::listMailboxes
public function listMailboxes($pattern, &$error, $flat = false)
{
	$error = null;

	$listGetter = function ($parent = null, $level = 0) use (&$listGetter, &$delimiter, &$error)
	{
		$pattern = $parent ? sprintf('%s%s%%', $parent, $delimiter) : '%';

		$list = $this->listex('', $pattern, $error);

		if (false === $list)
		{
			return false;
		}

		foreach ($list as $i => $item)
		{
			$item['title'] = $item['name'];
			$item['level'] = $level;

			if ($parent)
			{
				$regex = sprintf(
					'/^%s%s(.)/',
					preg_quote($parent, '/'),
					preg_quote($delimiter, '/')
				);

				if (!preg_match($regex, $item['name']))
				{
					unset($list[$i]);
					continue;
				}

				$item['title'] = preg_replace($regex, '1', $item['name']);
			}

			if ($item['name'] == $parent)
			{
				continue;
			}

			if ($item['delim'] === null)
			{
				continue;
			}

			$delimiter = $item['delim'];

			if (!preg_grep('/^ x5c ( Noinferiors | HasNoChildren ) $/ix', $item['flags']))
			{
				$children = $listGetter($item['name'], $level + 1);

				if ($children === false)
				{
					return false;
				}

				if (!empty($children))
				{
					$item['children'] = $children;
				}
			}

			$list[$i] = $item;
		}

		return array_values($list);
	};

	$list = $listGetter();

	if (false === $list)
	{
		return false;
	}

	$regex = sprintf(
		'/^%s$/i',
		preg_replace(
			array('/ ( x5c * )+ /x', '/ ( % )+ /x'),
			array('.*', $delimiter ? sprintf('[^x%s]*', bin2hex($delimiter)) : '.*'),
			preg_quote($pattern, '/')
		)
	);

	$listFilter = function ($list) use (&$listFilter, $regex)
	{
		foreach ($list as $i => $item)
		{
			if (!preg_match($regex, $item['name']))
			{
				if (empty($item['children']))
				{
					unset($list[$i]);
					continue;
				}
			}

			if (!empty($item['children']))
			{
				$item['children'] = $listFilter($item['children']);

				if (empty($item['children']))
				{
					unset($item['children']);
				}
			}

			$list[$i] = $item;
		}

		$list = array_values($list);

		for ($i = 0; $i < count($list); $i++)
		{
			$item = $list[$i];

			if (!preg_match($regex, $item['name']))
			{
				$children = empty($item['children']) ? array() : $item['children'];

				array_splice($list, $i, 1, $children);
				$i += count($children) - 1;
			}
		}

		return $list;
	};

	$list = $listFilter($list);

	$listHandler = function ($list, $path = array()) use (&$listHandler, $regex, $flat)
	{
		for ($i = 0; $i < count($list); $i++)
		{
			$item = $list[$i];

			$item['path'] = array_merge($path, array($item['title']));

			if (!empty($item['children']))
			{
				$item['children'] = $listHandler($item['children'], $item['path']);
			}

			$list[$i] = $item;

			if ($flat && !empty($item['children']))
			{
				unset($list[$i]['children']);

				array_splice($list, $i + 1, 0, $item['children']);
				$i += count($item['children']);
			}
		}

		return array_values($list);
	};

	$list = $listHandler($list);

	return $list;
}