Skip to content
Snippets Groups Projects
Functions.php 6.06 KiB
Newer Older
Адлан Шамавов's avatar
Адлан Шамавов committed
declare(strict_types=1);

namespace Hp\Test;

Адлан Шамавов's avatar
Адлан Шамавов committed
class Functions
{
    /**
Адлан Шамавов's avatar
Адлан Шамавов committed
    * Выполняет сортировку массива по убыванию цены
    * @param array $array
    * @return array
    */
Адлан Шамавов's avatar
Адлан Шамавов committed
    public function sortPrice(array $array): array
    {
        $prices = array_column($array, 'price');
        $counts = array_column($array, 'count');
        array_multisort(
            $prices,
            SORT_DESC,
            $counts,
            SORT_ASC, $array
        );
        return $array;
    }

Адлан Шамавов's avatar
Адлан Шамавов committed
    /**
     * На выход должна вернуть отсортированный массив по ключу *price* DESC
     * и во вторую очередь по *count* ASC:
     * [['price'=>12, 'count'=>4],  ['price'=>10, 'count'=>2],  ['price'=>8, 'count'=>4],
     * ['price'=>8, 'count'=>5],  ['price'=>5, 'count'=>5],]
     */
Адлан Шамавов's avatar
Адлан Шамавов committed
    /**
     * Найдет элемент с указаным id
     * @param array $array - массив, содержащий элементы со структурой
     * [
     *  'id' => 30,
     *  'name' => 'Jhon',
     *  'age' => 23,
     * ]
     * @param $id - ид искомого элемента
     * @return ?array - найденный элемент
     */
Адлан Шамавов's avatar
Адлан Шамавов committed
    public function search(array $array, int $id): ?array
    {
        $rowId = array_search($id, array_column($array, 'id'), true);
        if ($rowId) {
            return $array[$rowId];
        }
        return null;
Адлан Шамавов's avatar
Адлан Шамавов committed
    /**
     * Удалить дубликаты, оставив только уникальные значения
     * @param array $array
     * @return array
     */
Адлан Шамавов's avatar
Адлан Шамавов committed
    public function uniqElements(array $array): array
    {
        return array_unique($array, SORT_REGULAR);
Адлан Шамавов's avatar
Адлан Шамавов committed
    }
Адлан Шамавов's avatar
Адлан Шамавов committed
    /**
     * Выходной массив:
     * Array (
     *   [0] => Array([0] => laravel, [1] => php)
     *   [1] => Array([0] => codeigniter, [1] => php)
Адлан Шамавов's avatar
Адлан Шамавов committed
     *   [3] => Array([0] => c++, [1] => java))
Адлан Шамавов's avatar
Адлан Шамавов committed
     */

    /**
     * Сгруппировать подразедлы в верхние разделы меню
     * Дочерние элементы поместить в массив родителя с ключом submenu
     * Значение под ключом depth определяет уровень раздела
     * Массив $aMenu всегда начинается с элемента depth = 0,
     * все последующие элементы с depth = 1 являются его дочерними
     * элементами
     * @param array $aMenu
     * @return array
     */

    public function prepareMenu(array $aMenu): array
    {
        $result = [];
        foreach ($aMenu as $arr) {
            if ($arr['depth'] === 0) {
                $result[] = array(
                    'name' => $arr['name'],
                    'depth' => $arr['depth'],
                    'submenu' => []
                );
                continue;
            }
            $result[array_key_last($result)]['submenu'][] = array(
                'name' => $arr['name'],
                'depth' => $arr['depth'],
            );
        }
        return $result;
Адлан Шамавов's avatar
Адлан Шамавов committed
    }
Адлан Шамавов's avatar
Адлан Шамавов committed
    /**
     * Выходные данные:
     * $aMenu = [
     * [
Адлан Шамавов's avatar
Адлан Шамавов committed
     *  'name' => 'Смартфоны и гаджеты',
     *  'depth' => 0,
     *  'submenu' => [
     *      ['name' => 'Смартфоны, мобильные телефоны','depth' => 1,],
     *      ['name' => 'Планшеты','depth' => 1,],
     *      ['name' => 'Наушники и гарнитуры','depth' => 1,],],
     * ],
     * [
     *  'name' => 'Компьютеры и ноутбуки',
     *  'depth' => 0,
     *  'submenu' => [
     *      ['name' => 'Ноутбуки и аксессуары','depth' => 1,],
     *      ['name' => 'Компьютеры и мониторы','depth' => 1,],
     *      ['name' => 'Компьютерные комплектующие','depth' => 1,],]],
     * [
     *  'name' => 'Техника для дома',
     *  'depth' => 0,
     *  'submenu' => [
     *      ['name' => 'Техника для уборки','depth' => 1,],
     *      ['name' => 'Товары для ухода за одеждой','depth' => 1,],
     *      ['name' => 'Аксессуары для техники','depth' => 1,],]
     * ],
     * [
     *  'name' => 'Товары для дома и кухни',
     *  'depth' => 0,
     *  'submenu' => [
     *      ['name' => 'Посуда','depth' => 1,],]],
     * ];
     */
Адлан Шамавов's avatar
Адлан Шамавов committed
    /**
     * Функция рассчитывает кол-во дней до нового года
     * @param DateTimeImmutable $date дата от которой, необходимо рассчитать кол-во дней
     * @return int
     * @throws Exception
     */

    public function howDaysToNy(DateTimeImmutable $date): int
    {
        $endYear = date("Y-12-31", date_timestamp_get($date));
        $dateInterval = date_diff(new DateTimeImmutable($endYear), $date);
Адлан Шамавов's avatar
Адлан Шамавов committed
        return (int)$dateInterval->format("%a") + 1;
Адлан Шамавов's avatar
Адлан Шамавов committed
    /**
     * Вернет все пятницы 13 в году
     * @param int $year год, в котором необходимо произвести расчет
     * @return DateTimeImmutable[]
     * @throws Exception
     */

    public function countFriday13(int $year): iterable
    {
        $startDate = new DateTime("$year-01-01 Friday");
        ++$year;
        $endDate = new DateTime("$year-01-01");
        $interval = new DateInterval('P7D');
Адлан Шамавов's avatar
Адлан Шамавов committed
        foreach (new DatePeriod($startDate, $interval, $endDate) as $day) {
            yield new DateTimeImmutable($day->format("Y-m-d"));
        }
    }

Адлан Шамавов's avatar
Адлан Шамавов committed
    /**
     * Вернет кол-во дней между датами
     * @param DateTimeImmutable $dateStart дата начала
     * @param DateTimeImmutable $dateEnd дата окончания
     * @return int
     */
Адлан Шамавов's avatar
Адлан Шамавов committed
    public function diffDays(DateTimeImmutable $dateStart, DateTimeImmutable $dateEnd): int
    {
        $dateInterval = date_diff($dateStart, $dateEnd);
Адлан Шамавов's avatar
Адлан Шамавов committed
        return (int)$dateInterval->format("%a") ;