Skip to content
Snippets Groups Projects
Functions.php 6.39 KiB
Newer Older
<?php

namespace Hp\Test;

use DateTimeImmutable;
use DateTime;
use DateInterval;
use DatePeriod;

class Functions {
    /**
    * Выполняет сортировку массива по убыванию цены  *  
    * @param array $array  *  
    * @return array  
    */ 

    function sortPrice(array $array): array {
        array_multisort(array_column($array, 'price'), SORT_DESC, array_column($array, 'count'), SORT_ASC, $array);
        return $array;
    }

    //На выход должна вернуть отсортированный массив по ключу *price* DESC и во вторую очередь по *count* ASC:

    //[ ['price'=>12, 'count'=>4],  ['price'=>10, 'count'=>2],  ['price'=>8, 'count'=>4],  ['price'=>8, 'count'=>5],  ['price'=>5, 'count'=>5], ]


    /* Найдет элемент с указаным id  *  
    * @param array $array - массив, содержащий элементы со структурой  * 
    [  
        * 'id' => 30,  *      
        'name' => 'Jhon',  *      
        'age' => 23,  * 
    ]  
    * @param $id - ид искомого элемента  *  
    * @return array - найденный элемент   
    */ 
    function search($array, $id): ?array {
        $rowId = array_search($id, array_column($array, 'id'));
        return $array[$rowId];
    }

    /** 
     * Удалить дубликаты, оставив только уникальные значения    
     * @param array $array    
     * @return array  
     */ 

    function uniqElements(array $array): array {
        return array_unique($array, SORT_REGULAR);
    }  

    //Выходной массив: 
    /** Array (
     *   [0] => Array([0] => laravel, [1] => php)
     *   [1] => Array([0] => codeigniter, [1] => php)
     *   [3] => Array([0] => c++, [1] => java)) 
     * )
    */  

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

    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;
    }  

    /** Выходные данные: 
     * $aMenu = [
     * [
        * '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,],]], ];
    */

    /**  
     * Функция рассчитывает кол-во дней до нового года  
     * @param DateTime $date дата от которой, необходимо рассчитать кол-во дней  
     * @return int  
     */ 
    function howDaysToNy(DateTimeImmutable $date): int {
        $endYear = date("Y-12-31", date_timestamp_get($date)); 
        $dateInterval = date_diff(new DateTimeImmutable($endYear), $date);
        return $dateInterval->format("%a") + 1;
    }

    /** 
     * Вернет все пятницы 13 в году 
     * @param int $yaer год, в котором необходимо произвести расчет 
     * @return DateTimeImmutable[]  
     */ 
    function countFriday13(int $year): iterable {
        $stardDate = new DateTime("{$year}-01-01 Friday");
        $year += 1;
        $endDate = new DateTime("{$year}-01-01");
        $interval = new DateInterval('P7D');
        foreach(new DatePeriod($stardDate, $interval, $endDate) as $day) {
            yield new DateTimeImmutable($day->format("Y-m-d"));
        }
    }

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

    function readLogFile(string $filePath): void {
        if (file_exists($filePath)) {
            $text = "";
            $file = fopen($filePath, "r");
            while(!feof($file)) {
                $line = fgets($file);
                $text .= $line;
            }
            fclose($file);
            print($text);
        }
        else print("Такого файла не существует.");
    }
}